2011-12-26 12 views
3

プログラムのログイン機能を実装しようとしていますが、NULLポインタ例外が返されています。私は、あなたが何も持っていないメモリ内の場所を参照すると、これが起こることを理解していますが、私が見る限り、私はすべてのオブジェクトを正しくインスタンス化しています。isEmpty()メソッドを使用しているときにヌルポインタ例外を取得する

ユーザー追加機能を実装しようとしています。ユーザー名とパスワードのリストがあり、そのファイルを読み込んで配列に格納する既存のメソッドがあります。私はリストに新しいログインを書きたいので、この配列をArrayListに変換する新しいメソッドを書いて、最終的に新しいログインを書き込んだり、再度ログインファイルを書き出したりします。問題は、Null Pointer Exceptionを取得していることです。

方法1:

public String[] readFile(){ 
    ArrayList<String> dataList = new ArrayList<String>(); 
    String Line; 
    try { 
     String line = br.readLine(); 
     do {     
      dataList.add(Line); 
      line = br.readLine(); 
     } 
     while (!line.isEmpty()); 
     br.close(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    String[] dataArr = new String[dataList.size()]; 
    dataArr = dataList.toArray(dataArr); 

    return dataArr; // Returns an array containing the separate lines of the file 
} 

方法2:

public void addNewUser (String username, String password){ 
    String[] dataArr = readFile(); // Read in the list of profiles and store it in an array 
    ArrayList<String> dataAL = new ArrayList<String>(Arrays.asList(dataArr)); // store array of profiles as ArrayList 
    dataAL.add(username + "\t" + password); 

} 

答えて

18

おそらくここ

while (!line.isEmpty()); 

をNULLポインタを取得している

while(line!=null && !line.isEmpty()) 
に変更し、それを

例外のスタックトレースに注意を払った場合、例外が発生する正確な行が表示されます。

+1

をするだけの@ user1058210に説明する場合ので、これは問題を解決します'(bool && bool2)'の式の左辺はfalseで、右辺は評価されません。したがって 'line'が' null'の場合、 '!line.isEmpty()'は実行されません。 – Ozzy

+0

パンゲア!そして、説明のおかげでuser1031312! – user1058210

+0

@ user1058210これが実際にはurの質問に対する答えであればこれを回答として受け入れます –

1

ストリームの終わりに達した場合、BufferedReader.readLine()はnullを返します。あなたは空白行を無視したい場合は、このように変更し

String line = br.readLine(); 
while (line != null) {     
    dataList.add(Line); 
    line = br.readLine(); 
} 
br.close(); 

:だからに

while (line != null && !line.isEmpty()) 
0

変更あなたのtryブロックの身体をしたい

String line = br.readLine(); 
while (line != null) {     
    if (!line.isEmpty()) { 
     dataList.add(Line); 
    } 
    line = br.readLine(); 
} 
br.close(); 

提供する他の回答これまでのところ、最初の空白行で読み込みを停止します。空白行がない場合は、isEmpty()を呼び出す必要はありません。

0

readFileメソッドでnull値をdataListに追加する理由はわかりません。とにかく、私はあなたのコードをリファクタリングしました:

方法1

public ArrayList<String> readFile(){ 
    ArrayList<String> dataList = new ArrayList<String>(); 

    try { 
     //File & File Reader/Stream Initialization Logic 

     while(line = br.readLine() != null && !line.isEmpty()) {    
      dataList.add(line); 
     } 
    } catch (IOException IOE) { 
     //IO Exception Handling 
    } catch (Exception e) { 
     //General Exception Handling 
    } finally { 
     //close the reader/streams here 
    } 

    return dataList; 
} 

方法2

public void addNewUser (String username, String password){ 
    ArrayList<String> dataAL = readFile(); 
    dataAL.add(username + "\t" + password); 
} 
関連する問題