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 的变量,其中一个是该函数的本地变量(另一个是实例变量)。this.userLogin不一样userLogin。抱歉,如果我离开了。无意冒犯。

于 2012-12-06T04:57:05.733 回答
0

据我所知,将 userLogin 设置为长度为零的数组,并且永远不要增加它:

private String userLogin[] = {};

因此访问 userLogin 的任何元素都应该引发异常。真的和inputFile.next()通话没有任何关系。你可以做一个孤立的userLogin[0] = null,它应该会爆炸。

我建议您使用可以增量构建的 ArrayList 或其他动态大小的结构。

于 2012-12-06T05:10:18.820 回答
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

首先,您不需要扫描仪。BufferedReader 更简单。您可以使用 split 将单词分成一行。另外,请注意流关闭的位置(最后)。此外,我使用equals而不是==重新调整了条件。最后,一个 String.valueOf 允许将 char 数组与 String 进行比较。

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 回答