2016-07-01 5 views
0

私はファイルから読み込むJavaプログラムをプログラミングしています。ファイルの最後に停止する必要があります。 "While(line!= null)"過去にはテキストのすべての行を取るようになっていましたが、今は私にとってはうまくいきません。私の方法はこれです:それは働いて(行!= null)Javaで動作していないBufferedReader

int contator = 0; 
String line2 = ""; 
while (line2 != null) { 
      line2 = reader2.readLine(); 
      fi[contator]=line2; 
      for(int i =0;i<ret.length;i++){ 
       System.out.println("line2 : "+line2+"ret : "+ret[i]); 
       if(line2.toLowerCase().contains(ret[i])){ 
        fi[contator] = line2; 
        etiqueta[contator]=etiqueta[contator]+" reti"; 
       } 
      }contator ++; 
     } 

、私はプリントが右見、それが終了しなければならないとき、ヌルと最後の行を印刷し、「java.lang.NullPointerExceptionが」で終了します。私のような他の方法を試みた

line2 : Number of words ret : 361. 
line2 : Something here ret : 369. 
line2 : other things ret : 379.23 
line2 : nullret : 250.5//this is the problem, after this it throws exception 

を印刷:

while (line2 != "null") 
while (line2.length()>0) 
while (!line2.isEmpty) 

働いていた何も、私は、Eclipse IDE Mars.2上です。何か案が? ありがとうございます。

+0

である可能性があります。特に ''ヌル ''の意味について考えてみてください。 – Tom

+0

ええ、私はそれは意味がないことを知っている、私はここで文字列に何らかの "鋳造"をしている、私は多分プログラミングの多くの時間、失われたlitleだった。 – Amnor

+0

いいえ、 'line2'はすでにStringですが、変数' line2'がStringリテラル '' null ''と同じStringオブジェクトを参照しているかどうかを確認しています。そして '' null ''は' 'null''とは非常に異なっています。しかし、あなたは、元の 'while(line2!= null)'もうまくいかなかった理由をすでに知っています。 – Tom

答えて

7

あなたはのは、独自のコードを使用して実用的な例を見てみましょう


line2 = reader2.readLine();

line2 = reader2.readLine(); 
while (line2 != null) { 
    // Your code 
    line2 = reader2.readLine(); 
} 
を呼び出す順序を変更する必要があります。 line2は、ストリームの最後の行が含まれています。

while (line2 != null) {    // line2 is not null right now but contains the value of the last line 
    line2 = reader2.readLine();  // Since the last line has been read already, this returns null 
    // Your code is used with null and thus throws the exception 
} 
3

line2とnullを比較しています。

line2に新しい値を割り当てています。

あなたはline2で何かをしています。

ええと、何が問題なのですか?

+2

"うーん、ここで何が問題なの?"はい、それはOPが求めているものです。 (これは正しい方向を指していますが、それは実際には答えではなく、コメントのようです) –

+1

私は、多くの人々が彼に完全な解決策を直接投げていることを確信しています。だから、一人の人が彼を後退させるように招待し、自分に何が起こっているのかを明らかにする機会を与えてもらうことが重要です...時には、別の観点からあなたの問題を見ることができるということを伝える人が必要です。 – GhostCat

+0

この回答はちょうど私を悩ませています。時にはプログラミングでラプソスができて何が起こっているのかわかりません。多くの言語でプログラミングすると、これは一般的に起こります。多分あなたはコメントすることができましたが、私はここに理由が見当たりません。 – Amnor

8

whileループの先頭でループをチェックします。あなたはこのためにwhileループを使用したい場合は

while (line2 != null) {   // <=== Not null here 
    line2 = reader2.readLine(); // <=== But now it is, because 
           //  readLine returned null 
    // ... 
} 

通常のイディオムは、次のとおりです。確認後line2 = reader2.readLine();を置くことによって、あなたはline2nullためreader2.readLine()nullを返さなる可能性を導入しました:次いでline2に割り当て、

while ((line2 = reader2.readLine()) != null) { 
    // ...use line2 
} 

nullに対する結果の割り当て値をチェックします。 (それはまた、不要なループ上記line2 = "";します。)それはそう慣用だとして

これは、式の中でチェックが一般的に見られているの割り当てをやって非常に数少ない場所のひとつとです。

長い形式は次のとおりです。

line2 = reader2.readLine() 
while (line2 != null) { 
    // ...use line2 

    // get the next one 
    line2 = reader2.readLine(); 
} 

...しかし、行を複製することによって、それはあなたがバグを導入し、それらのいずれかを変更したが、他のではないでしょう可能性を紹介します。

3

whileループの本体は、line2がnullの場合でも実行されます。(基本的には、終了条件としてline2の前の値を使用していますが、これは当然間違いです。)したがって、NPEがスローされます。

なぜあなたはwhile条件の中に課題を入れませんか?

while ((line2 = reader2.readLine()) != null) 

ループテスト内で割り当てると、すべての人の好みにではありません(一部の民族はそれが難読化見つける。)しかし、それはそれらの1つである。この場合、便利な場合があります。

1

「2」に「2」を割り当ててからnullと比較しました。 (LINE2!=「ヌル」) `このアプローチを再考し、これは実際に何をするかを考えてくださいながら 解決策は`

while ((thisLine = br.readLine()) != null) { 
    System.out.println(thisLine); 
} 
関連する問題