2

EclipseにJUnitテストがあり(Junit3とJUnit4でこれを試しました)、ファイルを解析するメソッドをチェックしますが、何らかの理由で不明です。これを使用すると、フリーズまたはハングします。

while(scanner.hasNextLine() && scanner !=null){
   if(scanner.hasNext()){ do something }
}

しかし、私が以下を使用するとき、それはうまくいきます:

while(scanner.hasNextLine() && scanner !=null && scanner.hasNext() ){
   do something 
}

「何かをする」のコードは、scanner.next()を変数に割り当てることを除いて、特別なことを示していません。これらの変数はSystem.out.print()、どちらの場合も実際に正常に出力されます。これらは同じことをしていませんか?これは妥当なエラーですか(その場合は理由を説明してください)、それともばかげたバグですか?

4

1 に答える 1

3

まず、参照を逆参照する前にnullをチェックします。変化する

while(scanner.hasNextLine() && scanner !=null){
   if(scanner.hasNext()){ do something }
}

これに:

while(scanner !=null && scanner.hasNextLine()){
   if(scanner.hasNext()){ do something }
}

サンプルコードに記述されているように、nullスキャナーインスタンスが見つかりますが、(scanner!= null)は重要ではありません。代わりに、NullPointerExceptionを介してnullスキャナーが見つかります。

次に、質問の中で「scanner.next()を変数に割り当てる」と述べています。いくつかのコードを表示します。hasNextLine呼び出しごとに1回だけ呼び出しを行う必要があり、呼び出しごとに1回だけ呼び出しをnextLine行う必要があります。次のようなことをしているようです。hasNextnext

while (blam.hasNext())
{
    blah = blam.next();
    hoot = blam.next();
}

これは完全に間違っています。次の2回目の呼び出しで問題が発生します。

于 2013-03-22T17:17:14.980 に答える