当前位置: 首页 > 知识库问答 >
问题:

而循环与 hasNext 方法作为条件不断抛出 ArrayOutOfBounds 异常?(爪哇)

宋飞掣
2023-03-14

我正在使用GUI进行用户名/密码登录。我正在使用带有文件名扩展名hasNext()的time循环作为将文件中的信息存储到数组中的条件,以便我可以将用户的输入与存储在文件中的信息进行比较。然后我使用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();
    }
}

}








}

共有3个答案

白云
2023-03-14

您将这 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;
        }
    }
}
葛骏
2023-03-14

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

private String userLogin[] = {};

因此,访问userLogin的任何元素都会引发异常。它实际上与<code>输入文件没有任何关系。next()调用。您可以执行一个独立的用户登录[0]=null,它应该会爆炸。

我建议你使用一个数组列表或其他动态大小的结构,你可以逐步建立。

廖永长
2023-03-14

你试试把这行改为System.out.println(this.userLogin[i]);怎么样?我猜你有两个名为userLogin的变量,其中一个是这个函数的本地变量(另一个是实例变量)。this.userLoginuserLogin不同。如果我离开了,请道歉。无意冒犯。

 类似资料:
  • 我在我的android应用程序中使用增强for循环来迭代状态对象列表。 这将生成以下IndexOutOfBoundsException:java。lang.IndexOutOfBoundsException:索引0无效,大小为0 我意识到这是因为ArrayList的大小是0,这意味着它是空的。我的问题是,为什么它一开始就进入了循环,而不是为了保证这些问题不会发生而创建的增强for,以及如何阻止它。

  • 我有一个非常基本的函数,它搜索的数组列表,并返回与传递给它的参数匹配的帐户。但是,一旦抛出CustomerAccountNotFoundException,我的for循环就会中断。 我通过在异常后打印的值来测试这一点,该值一直被重置为0。如何在抛出异常后继续循环?我希望每次帐户不匹配时都抛出它,当它匹配时返回帐户。我还尝试过但不起作用。

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 我在Hackerrank上解决了一个任务。com,问题是这样的: 你有一个数组。这个数组包含数字。 现在输入两个数字: 第一个描述了一个总和 第二个描述了您添加在一起的索引量(序列长度) 最后你得到的序列的数量其总和就是你定义的数字 例如: 我为此写了这段代码: 由于我不知道需要多少次计数(例如,序列长度为3的6长度数组有4个序列(1,2,3,4 | 3,4,5 | 4,5,6)),当索引超出范围

  • 我知道这在StackOverflow上被问过很多次,但我尝试过很多不同的解决方案,没有一个奏效。所以我决定问问社区该怎么做。下面是我的代码中的相关片段。 请注意,这只是我的代码中从控制台输入的部分,不包含任何其他内容。我有其他东西设置,要求代码是这种格式。 将Input.HasNext()替换为Input.HasNextLine() 将input.hasnext()替换为input.next()!

  • null 为简洁起见,排除了getter和setter(用于所有字段)以及toString()。 我尽了最大的努力按照指导原则格式化代码,但它没有发生,请耐心等待。 @Entity@Table(name=“Products”)@XmlRootElement@NamedQueries({@NamedQuery(name=“Product.FindAll”,query=“从产品p中选择p”),@nam