1

GUIを使用してユーザー名/パスワードのログインに取り組んでいます。ユーザーの入力をファイルに格納されている情報と比較できるように、ファイル内の情報を配列に格納する条件として、ファイル名に hasNext() 拡張子を付けた while ループを使用しています。次に、if ステートメントを使用して比較を行います。一致する場合、プログラムはユーザーを別のクラスまたはメソッドにリダイレクトします。一致しない場合は何もしません。

問題は、ファイルから最初の行を読み取ろうとするときに、すぐに ArrayOutOfBounds 例外をスローし続けることです。

System.out.println(userLogin[i]) を投げて、ループが最後までループしたかどうかを確認しましたが、行が出力されないため、ループしてはなりません。私の推測では、while ループに入ると最初に停止するということです。これを修正するにはどうすればよいですか? よろしくお願いいたします。質問を明確にする必要がある場合は、コメントでその旨をお知らせください。できるだけ明確になるように投稿を再編集します。これは次のように私のコードです:

    private class ButtonListener implements ActionListener {

    public void actionPerformed(ActionEvent e){
        String usernameInput = "";
        char passwordInput[] = {};

        if(e.getSource() == okButton){
            usernameInput = usernameTF.getText();
            passwordInput = passwordTF.getPassword();
            try{
                verifyLogin(usernameInput, passwordInput); //sends input to be verified
            }catch (IOException ed){
                JOptionPane.showMessageDialog(null, "There was a problem " +
                        "retrieving the data.");
            }
        }else if (e.getSource() == cancelButton){
            setVisible(false);
            dispose();
        }
    }

}

これは、ユーザーのユーザー名とパスワードの入力を、ファイルに保存されているものと一致するかどうかをチェックするメソッドに送信するクラスとメソッドでした。

これは、入力が一致するかどうかを検証するメソッドです。

public void verifyLogin(String username, char[] password) throws IOException {
    File myFile = new File("Accounts.txt");
    Scanner inputFile = new Scanner(myFile);

        while (inputFile.hasNext()) {
            int i = 0;

            this.userLogin[i] = inputFile.next();
            System.out.println(userLogin[i]);  //says this is where the OutOfBounds occurs
            this.passLogin[i] = inputFile.nextLine();
            this.passwordCheckLogin = this.passLogin[i].toCharArray();

            if((this.userLogin[i] == username) && (this.passwordCheckLogin == password)){
                JOptionPane.showMessageDialog(null, "Access Granted");
                inputFile.close();
                break;
            }

            i++;

        }


}

ファイル内の情報は次のように記述されています (左側にユーザ​​ー名、右側にパスワードが続きます)。

John001 bananas
Mike001 123chocolate

ありがとうございました!

これがコード全体です。以前に含めなかったことをお詫びします。うまくいけば、これが私の質問をよりよく理解するのに役立ちます。回答にお時間を割いていただき、重ねてお礼申し上げます。

import java.util.Scanner;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;


public class DeskLogin extends JFrame {

private final int WINDOW_WIDTH = 200;
private final int WINDOW_HEIGHT = 300;
private JLabel usernameLabel;
private JLabel passwordLabel;
private JButton okButton;
private JButton cancelButton;
private JTextField usernameTF;
private JPasswordField passwordTF;
private JPanel loginPanel;
private String userLogin[] = {};
private String passLogin[] = {};
private char passwordCheckLogin[] = {};



public DeskLogin(){
super("Login");
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
buildPanel();
add(loginPanel);

}

private void buildPanel() {
usernameLabel = new JLabel("Username: ");
passwordLabel = new JLabel("Password: ");
usernameTF = new JTextField(10);
passwordTF = new JPasswordField(10);
okButton = new JButton("OK");
cancelButton = new JButton("Cancel");

loginPanel = new JPanel();

loginPanel.add(usernameLabel);
loginPanel.add(usernameTF);
loginPanel.add(passwordLabel);
loginPanel.add(passwordTF);
loginPanel.add(okButton);
loginPanel.add(cancelButton);


okButton.addActionListener(new ButtonListener());
cancelButton.addActionListener(new ButtonListener());
}

public void verifyLogin(String username, char[] password) throws IOException {
File myFile = new File("Accounts.txt");
Scanner inputFile = new Scanner(myFile);

inputFile.useDelimiter(" ");

    while (inputFile.hasNext()) {
        int i = 0;

        this.userLogin[i] = inputFile.next();
        System.out.println(userLogin[i]);
        this.passLogin[i] = inputFile.nextLine();
        this.passwordCheckLogin = this.passLogin[i].toCharArray();

        if((this.userLogin[i] == username) && (this.passwordCheckLogin == password)){
            JOptionPane.showMessageDialog(null, "Access Granted");
            inputFile.close();
            break;
        }

        i++;

    }


}

private class ButtonListener implements ActionListener {

public void actionPerformed(ActionEvent e){
    String usernameInput = "";
    char passwordInput[] = {};

    if(e.getSource() == okButton){
        usernameInput = usernameTF.getText();
        passwordInput = passwordTF.getPassword();
        try{
            verifyLogin(usernameInput, passwordInput);
        }catch (IOException ed){
            JOptionPane.showMessageDialog(null, "There was a problem " +
                    "retrieving the data.");
        }
    }else if (e.getSource() == cancelButton){
        setVisible(false);
        dispose();
    }
}

}








}
4

4 に答える 4

0

読む行を変えてみてはSystem.out.println(this.userLogin[i]);いかがですか?私の推測では、userLogin という名前の 2 つの変数があり、そのうちの 1 つはこの関数に対してローカルです (もう 1 つはインスタンス変数です)。this.userLoginと同じではありませんuserLogin。オフの場合は申し訳ありません。悪意はありません。

于 2012-12-06T04:57:05.733 に答える
0

これら 3 つの設定を配列として持っていますが、それらを配列として使用したり、verifyLogin の外で使用したりすることはありません。

private String userLogin[] = {};
private String passLogin[] = {};
private char passwordCheckLogin[] = {};

これには追加のコードが必要ですが、正しい方向に進む必要があります。これら 3 つのローカル変数を作成し、それらを使用するようにコードを調整しました。

public void verifyLogin(String username, char[] password) throws IOException {
    File myFile = new File("Accounts.txt");
    Scanner inputFile = new Scanner(myFile);
    String userLogin = null;
    String passLogin = null;
    char[] passwordCheckLogin = null;

    while (inputFile.hasNext()) {
        userLogin = inputFile.next();
        if (inputFile.hasNext()){
            passLogin = inputFile.next();
            passwordCheckLogin = passLogin.toCharArray();
        }
        else {
            //Need to alert that we have an improperly formatted Accounts.txt
            break;
        }
        if((userLogin == username) && (passwordCheckLogin == password)){
            JOptionPane.showMessageDialog(null, "Access Granted");
            inputFile.close();
            break;
        }
    }
}
于 2012-12-06T05:18:55.303 に答える
0

私が言える限りでは、userLogin を長さゼロの配列に設定し、それを増やしてはいけません:

private String userLogin[] = {};

したがって、userLogin の任意の要素にアクセスすると、例外がスローされます。inputFile.next()通話とは全く関係ありません。あなたは隔離することができuserLogin[0] = null、それは爆発するはずです。

ArrayList など、段階的に構築できる動的なサイズの構造を使用することをお勧めします。

于 2012-12-06T05:10:18.820 に答える
0

まず、スキャナーは必要ありません。BufferedReader はより単純です。分割を使用して、単語を 1 行に分割できます。また、ストリーム クローズ (最後) の配置にも注意してください。また、 ==ではなくequalsを使用して条件を再調整しました。最後に、char 配列を String と比較できるようにするための String.valueOf。

File myFile = new File("Accounts.txt");
BufferedReader inputFile = new BufferedReader(
       new InputStreamReader(new FileInputStream(myFile)));

String line;
while ((line = inputFile.readLine())!=null) {
    int i = 0;

    this.userLogin[i] = line.split(" ")[0];
    System.out.println(userLogin[i]);
    this.passLogin[i] = line.split(" ")[1];
    this.passwordCheckLogin = this.passLogin[i].toCharArray();

    if (this.userLogin[i].equals(username) 
      && String.valueOf(this.passwordCheckLogin).equals(password)){
        JOptionPane.showMessageDialog(null, "Access Granted");                
        break;
    }

    i++;    
}
inputFile.close();
于 2012-12-06T10:57:31.340 に答える