18

Javaには短絡評価があると思いましたが、この行はまだヌルポインター例外をスローしています:

if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) {

この場合perfectAgentnullであるため、式全体が を返すようにしたいのですfalseが、この行で NullPointerException が発生してアプリがまだクラッシュしています。

編集、一般的な応答:

perfectAgentisであるため、式が true になることはあり得ないため、 の右側にあるものは実行されませんnull。さらに言えば、有効な参照が含まれていないため (null ですべて)、実行&&することはできません。別のステートメントでnullをチェックする必要がないように、短絡評価を使用しようとしています。これにより、ロジックがより雑になります。perfectAgent.getAddress()perfectAgent

編集2(または、私はばかです):ええ、人生の多くのことと同様に、自分がバカだと世界に発表した直後に答えを見つけます. この場合、何か他のことをしているときに Eclipse の自動ビルドをオフにし、オンに戻さなかったので、ソースと一致しないクラス ファイルをデバッグしていました。

4

7 に答える 7

10

perfectAgentが本当に null の場合、そのコードは例外をスローしません(少なくとも、式の途中で非 null から null に変更する奇妙なスレッド処理が行われていないと仮定します)。短いが完全なプログラムを作成して、そうする方法を示すことができれば、私はまったくショックを受ける.

そうです、あなたの直感は正しいです - これは問題にはなりません。他の場所で原因を探します。perfectAgent それは実際にはnullではなく、そのコードで例外を引き起こす可能性のある他の状況に遭遇していると強く思います。

そのコードの一部を短いが完全な例に抽出することをお勧めします。それができれば、比喩的な帽子をかぶるつもりです。そうでない場合は、抽出を試みている間に問題が見つかることを願っています。

perfectAgentそれが本当にゼロだと思う理由は何ですか?その前に次のコードを挿入してみてください。

if (perfectAgent == null)
{
    System.out.println("Yup, it's null");
}

もう 1 つの非常にわずかな可能性は、JIT バグに遭遇したということですが、私はそれを非常に疑っています。

于 2009-11-29T21:21:49.140 に答える
7

Javaには短絡評価があります。おそらくそうentryでありnull、それentry.getKey()が原因NullPointerExceptionです。別の可能性は、どこgetAddress()かで戻っnullてくるか、内部で起こっていることです (単純なステートメントNullPointerExceptionよりも複雑な場合)。return

編集:私はあなたがこれを主張するあなたの編集を見ます:

もっと言えば、実行することは不可能perfectAgent.getAddress()です...

しかし、が正常に実行されて返された場合perfectAgent.getAddress() どうなるでしょうか? 私が何を意味するか見てください... null

于 2009-11-29T21:15:17.093 に答える
6

高度なデバッグ レッスン #1:

一見不可能なエラー (たとえば、Java に関する知識と矛盾するエラー) に遭遇した場合は、次の手順を実行します。

  • 評判の良い教科書 (または、関連する標準) を参照して、自分の理解に誤りがないことを確認してください。(この場合、あなたの理解は正しかったので、まともな教科書ならすぐに確認できます。)

  • 不可能なエラーを引き起こす可能性のある愚かなことをすべて確認してください。ファイルを保存しない、完全なビルドを実行しない、アプリケーションの古い/古いバージョンを実行する、間違ったディレクトリにいるなどのことです。

要約すると、もう少し自分自身を疑うことを学びましょう。

于 2009-11-29T23:24:30.097 に答える
2

が null でないことを確認するため、orの 1つperfectAgent以上が null でなければなりません。または、getAddress() または getKey() が実装で NPE にヒットしています。 perfectAgent.getAddress()entryentry.getKey()

このようなことをデバッグするには、まずスタック トレースを見て場所を突き止めます。これにより、getAddress() または getKey() で発生しているか、それらを呼び出す貼り付けられたコード スニペットで発生しているかがわかります。次に、このスニペットにある場合は、if の前にコードを追加して、どれが null かをテストします。古き良き System.err.println() またはassertionsを使用できます。(アサーションを使用する場合は、java コマンドの -enableassertions フラグを使用して有効にしてください。)

更新:したがって、私の解釈は間違っていることが判明しました...問題は2つの矛盾する事実を提示し(この行にはNPEがありましたが、短絡が発生するはずでした)、最初の事実が真で2番目の事実が間違っていると自動的に仮定しました実際には、Eclipse で自動ビルドをオフにしたため、まったく別の問題でした。当たり前!「不可能」なことをデバッグする場合、根本的に懐疑的であることが役に立ちます。

于 2009-11-29T21:15:12.803 に答える
1

大ミステリー。私はあなたのコード行をコピーしperfectAgent == null、 、entry == nullentry.getKey() == nullおよびそれらの組み合わせでテストしました: 私のテスト ベッドには NPE はありません (Java 1.6)。

厄介なバグが何であれ、短絡評価と関係があるとは思えません。この行が NPE の原因である場合、私が言える限り、 perfectAgent は null ではありません。頑張ってください - 見つけたらバグを見せてください :)

于 2009-11-29T21:45:47.393 に答える
1

null になる可能性のある、 perfectAgent 以外の 3 つの参照があります。

  • perfectAgent.getAddress()
  • エントリ
  • entry.getKey()

ステートメントを分割するか、デバッガーで実行します。

于 2009-11-29T21:17:38.930 に答える
0

コードを次のようにフォーマットしてみてください。

if( 
  (perfectAgent != null) 
  && (
      perfectAgent.getAddress()
      .equals(
       entry.getKey()
      )
     ) 
  ) {

これにより、スタック トレース ライン エントリが改善されます。

于 2009-11-29T21:54:55.503 に答える