2012-01-02 13 views
1

私はAndroidに移植しようとしているJavaでアプリケーションを作成しましたが、何らかの理由でBufferedReaderのreadLine() 。私はJavaでコードをテストし、問題なく動作します。私が読んでいるファイルは、私が残りのjavaファイルに入れたプレーンテキストファイルです。私のコードの簡単なログイン用とでプロファイルを持つテキストファイルを読み込むことにより、ログインボタンをチェック詳細をクリックすると、ユーザー入力を取り込み、以下の私のコードのsimplicationです。主な活動でAndroidアプリケーションではnullを返すが、Javaアプリケーションではnullを返すBufferedReader

OnClickListener:

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 if login details are correct 
      LoginModel login = new LoginModel(); 
      Correct = login.isCorrect(username, password); // LINE COMMENTED 
      // OUT SO THAT DETAILS DON'T NEED TO BE ENTERED 

      //    Correct = true; // used to bypass login for now 
      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..."); 

     } 
    }); 
} 

LoginModel.javaクラス:

public LoginModel() { 
    file = new File("Profiles"); 
    try { 
     br = new BufferedReader(new FileReader(file)); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("Login Constructor successful!"); 
} 

// Checks whether the inputted details are correct 
public static boolean isCorrect(String u, String p) { 
    System.out.println(p); 
    boolean check = false; 
    String line = null; 
    try { 
     do { 
      line = br.readLine(); // This line is returning null 
      // 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); 
    return check; 

これは、いくつかの理由でnullを返しているbr.readLine()です。私はそれを見て、bufferedreaderは完全にサポートされているようだ。

編集:私はそれが実際にファイルを見つけるのではなく、おそらくisCorrect()メソッドを静的だったので実行しようとしていたことがわかりました。メソッドとbr宣言静的タグを削除し、プロファイルのテキストファイルをすべてのJavaファイルが入ったフォルダに移動しましたが、まだ見つかりません。どのように私はその位置を参照する必要がありますか?私が単に名前で参照すると、アンドロイドがファイルを探すデフォルトの位置は何ですか?どうもありがとう!

答えて

0

それはNPEの実際の原因であるが、それはdefinetlyバグであるかどうかはわからない:

あなたのコンストラクタでbrを初期化されますが、静的であるisCorrect()でそれを使用します! oreder内の囲みクラスLoginModelを呼び出す必要はないので、brを使用する前にc'torがまったく呼び出されないことがあります。

宣言するときにはbrを初期化するか、静的スコープで初期化する必要があります。そのため、クラスが読み込まれると初期化されます。

編集:それはまたbrがstaticとして宣言されていることを示していること注 - そうLogicModelのすべてのインスタンスが実際にbrの同じオブジェクトを使用します!
br.readLine()がヌルを返す理由 - isCorrect()、またはbrを使用する他の方法で既にファイルを使い果たしている可能性がありますが、それ以上のコードなしではそれを特定することは不可能です。

+0

これは良い点です。私はちょうどJavaを始めました。スコープの問題を避けるために静的なメソッドをたくさん宣言していましたが、明らかにたくさんあります今私が気づいている落とし穴のうちのひとつ!私は静的修飾子を削除しましたが、エラーを取り除いていません。テキストファイルから読んでいる場合は、Androidプロジェクトにどこに配置すればよいですか? – user1058210

+0

何らかの理由で実際のファイル名が必要な場合は、アセットを使用します。これは別のフォルダ[project]/assetsにあります。それ以外の場合は、[project]/res/rawフォルダがあるrawリソースを使用できます。 Resources Managerを使用してResources.openRawResource(http://developer.android.com/reference/android/content/res/Resources.html#openRawResource(int))または(アセットを使用する場合は)http: //developer.android.com/reference/android/content/res/AssetManager.html)。 – Boude

+0

@ user1058210:brがnullを返した理由については、私の編集をお読みください。 – amit

0

FileNotFoundExceptionがキャッチされていないことを確認してください。これは、Androidがファイルを見つけることができなかったため、BufferedReaderを作成できなかったため、nullになっていたことを意味します。プロセスによってlogcatでFileNotFoundException(通常はオレンジ色)を検索するか、ブレークポイントを使用してデバッグします。

編集: ファイルをAndroidで使用する場合、通常はres/rawフォルダに配置されます。これは、アンドロイドにはファイルの主な開始点がないためです。実際、アンドロイドはファイルへのアクセスを制限する方が好きです(論理的な安全性の問題のため)。

だから、あなたがしなければならないだろ何:

  1. のres /生フォルダに置き、ファイルをとする「プロファイル」 (Androidはリソースで大文字のを許可していません)(多分あなたに名前を変更先に フォルダを作成する必要があります)。 リソースを受信するための

  2. 編集コンストラクタ(のように変更します。 "公共LoginModelを(リソースRES)")

  3. 編集に応じて初期化する(変更 "をLoginModelログイン=新しい LoginModel();" へ"LoginModel login = new LoginModel(getResources());")

  4. 次に、 "br = new BufferedReader(new FileReader(file));"を変更します。 "br = 新しいBufferedReader(新しい InputStreamReader(res.openRawResources(R.raw.profiles)));"

  5. "file = new File(" Profiles ");"という行を削除します。

+0

あなたは正しいと思いますが、実際にファイルを見つけていません。私はすべてのJavaファイルと同じ場所に配置し、コード内の名前で単純に参照しましたが、まだそれを見つけることはできません。その場所をどのように参照しますか? – user1058210

関連する問題