登录顺序的逻辑

时间:2016-04-28 20:56:17

标签: java file class

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

我得到以下输出,这表明我的程序没有表现出我喜欢的方式:

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

2 个答案:

答案 0 :(得分:3)

看起来问题出现在这段代码中。

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

检查用户名时,您只是看到用户是否存在而不是当前用户&#34; i&#34;匹配输入的内容。这应该改为:

if (usernames.get(i).equals(user)) {

逻辑是:

枚举所有用户。 如果当前用户名与测试用户名匹配,请检查密码。 如果提供的密码与记录的密码相匹配,请登录用户。否则,登录失败。

答案 1 :(得分:0)

想象一下,您有两个"Darth Vader"个用户,一个用户使用密码"Luke",另一个用户使用密码"Leia"。 此外,假设您只想接受密码为"Luke"的密码,并且密码为"Darth Vader"的{​​{1}}位于文本文件的第一位。

请注意,使用您的代码,您将在"Leia"循环中输入for 对于密码错误的if (this.usernames.contains(user)),因此,由于他没有好的密码,它会显示"Darth Vader"(你输入其他的)!

现在,遵循相同的逻辑,在"USERNAME OR PASSWORD INCORRECT! TRY AGAIN"的迭代中我们有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之后,它使代码看起来更干净(并且更容易调试)。