2012-01-03 13 views
0

入力したユーザー名とパスワードをすべてのユーザー名とパスワードのテキストファイルでチェックする方法を作成しました。興味深い問題は、詳細が正しければアプリケーションが進むが、詳細が間違っていればNullPointerExceptionを返すということである。私のコードは以下の通りです:Javaのログインメソッド:詳細が正しくても実行されますが、NullPointerExceptionが正しくない場合に実行されます。

// Checks whether the inputed details are correct 
public boolean isCorrect(String u, String p) { 
    boolean check = false; 
    String line = null; 
    try { 
     do { 
      line = br.readLine(); 
      // System.out.println("Checking profile : " + line); 
      String[] info = line.split("\t"); 
      // nested if-statement to improve efficiency over && 
      if (info[0].equals(u)) { 
       System.out.println("username found!"); 
       if (info[1].equals(p)) { 
        System.out.println("password correct!"); 
        check = true; 
       } else System.out.println("password incorrect!"); 
      } else System.out.println("username not found!"); 
     } while (line != null && check == false); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return check; 
} 

返されたブール値が主な活動で、次のコードに入力されますが:真=正しいが、それが実行されている場合、なぜ

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.loginpanel); 
    Button button = (Button) findViewById(R.id.btnLogin); 
      Correct = false; 



    lm = new LoginModel(this); 

    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      EditText textUsername = (EditText) findViewById(R.id.textUsername); 
      EditText textPassword = (EditText) findViewById(R.id.textPassword); 

      // Collect the login details entered by the user 
      String username = textUsername.getText().toString(); 
      String password = textPassword.getText().toString(); 

      // Check the application is registering the correct details 
      System.out.println(username + "\n" + password); 

      Correct = lm.isCorrect(username, password); 

      if (Correct) { // if details are correct then start main program 
       Intent intent = new Intent (LoginView.this, MenuListView.class); 
       startActivity(intent); 
      } 
      else System.out.println("Login is incorrect..."); 
     } 
    }); 
} 

私は理解していないことはありませんですCorrect = falseの場合、重大な例外を生成するプログラムがクラッシュします。main、そしてNullPointerException - 単にSystem.out.printlnを出力してはいけません。

+2

_パスワードをプレーンテキストで保存しないでください_。 **特にクライアント上にない** – SLaks

+1

NullPointerExceptionが実際にどこに発生しているか表示していない - スタックトレースには何が表示されますか? –

+3

'//効率を改善するためにifステートメントをネストしました。&&'間違っています。 '&&'は短絡しています。 – SLaks

答えて

5

ファイルの最後に移動すると、linenullになります。
したがって、ネストラインのsplit()を呼び出すことはできません。

ただし、はこのコードを使用しません。それは非常に間違っており、一度リリースされるとパスワードが漏れてしまいます。

+0

エラーがどこでSLaksであるかを指摘してくれてありがとう - 私は誰もが言ったことを念頭に置いてコードを書き直します! – user1058210

+0

代わりに、保護されたプライベートサーバーでSaltedハッシュを使用してください。 – SLaks

関連する問題