В то время как цикл с методом hasNext в качестве условия продолжает вызывать исключение ArrayOutOfBounds? (Ява)

Я работаю над логином/паролем с помощью графического интерфейса. Я использую цикл while с расширением hasNext() имени файла в качестве условия для сохранения информации, содержащейся в файле, в массив, чтобы я мог сравнить ввод пользователя с информацией, хранящейся в файле. Затем я использую оператор 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();
    }
}

}








}

person Graham S.    schedule 06.12.2012    source источник
comment
Я сомневаюсь, что исключение находится в строке, которую вы указываете, поскольку вы обращаетесь к этому индексу в строке над ним. Не обращайте внимания на очевидные ошибки (например, i всегда равно 0). Можете ли вы дать нам самодостаточный фрагмент кода, который действительно демонстрирует проблему? То, что вы дали нам, является черновой копией, которая не точно воспроизводит ваш код.   -  person Mark Peters    schedule 06.12.2012
comment
Правильно ли объявлен и инициализирован массив userLogin[]?   -  person Extreme Coders    schedule 06.12.2012
comment
Где вы заполняете массив userLogin[] и какова его длина?   -  person Cyrille Ka    schedule 06.12.2012
comment
Поскольку вы всегда устанавливаете i=0, а this.userLogin[i] = inputFile.next(); работает, System.out.println(userLogin[i]); никак не даст IndexOutOfBoundException. Пожалуйста, пересмотрите свой код. Проблема в другом. Также i++; в конце бесполезно, так как i в начале устанавливается на 0.   -  person Yogendra Singh    schedule 06.12.2012
comment
тип возвращаемого значения or next() — String. как работает userLogin[i]? userLogin [] - это массив строк?   -  person Bhavik Shah    schedule 06.12.2012
comment
Вы проверили, находится ли account.txt в том же рабочем каталоге?   -  person Bhavik Shah    schedule 06.12.2012


Ответы (4)


Как насчет того, чтобы попробовать изменить строку на System.out.println(this.userLogin[i]);? Я предполагаю, что у вас есть две переменные с именем userLogin, одна из которых является локальной для этой функции (другая является переменной экземпляра). this.userLogin не то же самое, что userLogin. Извините, если я отсутствую. Без обид.

person kahowell    schedule 06.12.2012

Насколько я могу судить, вы установили для userLogin массив нулевой длины и никогда не увеличивали его:

private String userLogin[] = {};

Поэтому доступ к любому элементу userLogin должен вызвать исключение. На самом деле это не имеет ничего общего с вызовом inputFile.next(). Вы можете сделать изолированный userLogin[0] = null, и он должен взорваться.

Я предлагаю вам использовать ArrayList или другую структуру с динамическим размером, которую вы можете создавать постепенно.

person Ben Kelly    schedule 06.12.2012

У вас есть эти 3 настройки как массивы, но вы никогда не используете их как массивы, и вы также никогда не используете их вне VerifyLogin.

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

Для этого потребуется дополнительный код, но вы должны двигаться в правильном направлении. Я создал локальные переменные для этих трех и скорректировал код для их использования.

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;
        }
    }
}
person Tad    schedule 06.12.2012

Во-первых, вам не нужен сканер. BufferedReader проще. Вы можете использовать split, чтобы разбить слова в строке. Также обратите внимание на размещение потока близко (в конце). Также я изменил условное выражение, используя equals вместо ==. Наконец, 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();
person xagyg    schedule 06.12.2012