2016-04-28 120 views
2

我有一個代碼,打開一個文件來檢查用戶給出的用戶名或密碼是否在文件中,但是代碼顯示登錄成功時沒有登錄。我是編程初學者,所以我需要一些幫助來修復錯誤,並且使用基本的初學者編碼,而不需要複雜的庫或方法。登錄順序的邏輯

我得到下面的輸出,這說明我的程序並不表現我怎麼想它:

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

你得到的錯誤是什麼。 – tesnik03

+0

你能顯示文件的內容嗎? – raven

+3

請使用標題更具描述性! – Vucko

回答

0

想象一下,您有兩個"Darth Vader"用戶,一個密碼爲"Luke",另一個密碼爲"Leia"。 此外,假設您只想接受密碼爲"Luke"的密碼,並且密碼爲"Leia""Darth Vader"在您的文本文件中首先出現。

注意,你的代碼,你會在你的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,跟在if (tries == 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--; 
        } 
       } 
      } 

檢查用戶名時,您只是看到用戶是否存在,而不是當前用戶「i」是否與輸入內容匹配。這應改爲:

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

的邏輯則是:

枚舉所有用戶。 如果當前用戶名與測試用戶名匹配,請檢查密碼。 如果提供的密碼與記錄中的內容相匹配,請將用戶登錄。否則,登錄失敗。