我有一个打开文件的代码,以检查用户提供的用户名或密码是否在文件中,但是当实际上没有一个用户名或密码时,该代码显示成功登录。我是编码的初学者,所以我需要一些帮助来修复错误并使用基本的初学者编码,而无需复杂的库或方法。
我得到以下输出,这表明我的程序没有按照我的意愿进行操作:
USERNAME OR PASSWORD INCORRECT! TRY AGAIN
SUCCESSFUL, YOU ARE LOGGED IN!
这是代码:
package login;
import java.io.File;
import java.io.FileNotFoundException;
public class Main {
public static void main(String[] args) throws FileNotFoundException {
// TODO code application logic here.
File file = new File("users.txt");
Login newLogin = new Login(file);
newLogin.checkLogin("word", "wordet");
}
}
package login;
import java.io.File;
//library for file exception
import java.io.FileNotFoundException;
import java.util.ArrayList;
//library for opening file
import java.util.Scanner;
public class Login {
private File file;
private ArrayList<String> usernames;
private ArrayList<String> passwords;
private int tries = 3;
public Login(File file) {
this.file = file;
this.usernames = new ArrayList<String>();
this.passwords = new ArrayList<String>();
this.tries = 3;
}
public void readLines() throws FileNotFoundException{
ArrayList<String> lines = new ArrayList<String>();
Scanner input = new Scanner(this.file);
while (input.hasNextLine()){
lines.add(input.nextLine());
}
input.close();
usernames.clear();
passwords.clear();
for(int i = 0; i < lines.size(); i++) {
if (i %2 == 0) {
usernames.add(lines.get(i));
} else {
passwords.add(lines.get(i));
}
}
}
public void checkLogin(String user, String pass) throws FileNotFoundException{
this.readLines();
if (tries == 0){
System.out.println("YOU HAVE TRIED TOO MANY TIMES!");
} else {
for(int i = 0; i < this.usernames.size(); i++) {
if (this.usernames.contains(user)) {
if (passwords.get(i).equals(pass)) {
System.out.println("SUCCESSFUL, YOU ARE LOGGED IN!");
} else {
System.out.println("USERNAME OR PASSWORD INCORRECT! TRY AGAIN");
tries--;
}
}
}
}
}
}
最佳答案
假设您有两个"Darth Vader"
用户,一个用户的密码为"Luke"
,另一个用户的密码为"Leia"
。
另外,假设您只接受密码为"Luke"
的密码,而密码为"Darth Vader"
的"Leia"
首先出现在文本文件中。
请注意,使用您的代码,您将在for
循环中输入if (this.usernames.contains(user))
密码错误的那个"Darth Vader"
,因此,由于他没有好的密码,它将显示"USERNAME OR PASSWORD INCORRECT! TRY AGAIN"
(您输入else)!
现在,按照相同的逻辑,在for
的迭代中,我们拥有具有良好密码的"Darth Vader"
,您将显示"SUCCESSFUL, YOU ARE LOGGED IN!"
这是一种解决方案:
public void checkLogin(String user, String pass) throws FileNotFoundException{
this.readLines();
if (tries == 0){
System.out.println("YOU HAVE TRIED TOO MANY TIMES!");
return;
}
int i = 0;
for(; i < this.usernames.size(); i++) {
if (!this.usernames.contains(user))
continue;
if (passwords.get(i).equals(pass)) {
System.out.println("SUCCESSFUL, YOU ARE LOGGED IN!");
break;
}
}
if (i == this.usernames.size())
System.out.println("USERNAME OR PASSWORD INCORRECT! TRY AGAIN");
}
请注意,我允许我自己更改代码中的某些内容,例如删除
else
,紧随if (tries == 0)
之后,这使代码看起来更简洁(更易于调试)。