我有一个打开文件的代码,以检查用户提供的用户名或密码是否在文件中,但是当实际上没有一个用户名或密码时,该代码显示成功登录。我是编码的初学者,所以我需要一些帮助来修复错误并使用基本的初学者编码,而无需复杂的库或方法。

我得到以下输出,这表明我的程序没有按照我的意愿进行操作:

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)之后,这使代码看起来更简洁(更易于调试)。

10-05 18:53