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();
}
}
}
}