23

私はEclipseを使用し、Javaでプログラミングしています。何時間も悩まされる nullPointerException に出くわすことがあります。とにかくnullPointerExceptionsをよりよくデバッグし、変数値とは何か、およびnull Pointer Exceptionsの原因となるその他のものを把握する方法はありますか?

4

3 に答える 3

33

スタック トレースを見て、NullPointerExceptionがスローされた行番号を読み取ります。ほとんどの場合、行には次のようなメソッド呼び出しがあります

x.getValue()

の場合、xnull取得しNullPointerExceptionます。スタック トレースの先頭にあるメソッドがコードではない場合は、コードに到達するまでスタックをトレースします。この場合、多くの場合、パラメーターnullを好まないメソッドに渡していnullます。それを見つけて修正します。

また、 をスローしている自分のものではないメソッドに遭遇した場合はNullPointerException、ドキュメントをよく読んでください。たとえば、次を見てくださいString.replace(CharSequence target, CharSequence replacement)

投げる

NullPointerException-targetまたはreplacementである場合null

それ以上に明確になることはありません!

次に例を示します。

ここに画像の説明を入力

4行目を見ると、 が見えfoo.bar()ます。これは であることを意味しfooますnull。それは簡単です。別の例を見てみましょう。

ここに画像の説明を入力

コードをたどると、それs.replace(target, replacement)がスローされていることがわかります。と を調べる必要がtargetありreplacementます。デバッガーをアタッチしましょう。

ここに画像の説明を入力

あはは!replacementですnull。Eclipse でも同じことができます。例外がスローされたときのブレークポイントを設定し、それを使用してメソッドのパラメーターを調べます。私はここでは原始的です。なぜなら、最初に困難な方法でそれを行うことを学べば、誰もがより良くなると心から信じている考え方の学校から来たからです。漏れやすい抽象化とそのすべて。

于 2013-07-26T02:18:34.443 に答える
4

NullPointerException問題を軽減する方法がいくつかあります。

  1. @Nullable アノテーションを使用します。

  2. nullコンストラクターとセッターで引数の値をテストします(単純な古い Java コードのセッターは避けてください)。これを何度も行うと、(Eclipse) ソース コード テンプレートを作成してコードをすばやく生成できます。これは「フェイルファスト」と呼ばれます。フィールドに値を格納した後など、値がコード内でさらに使用されているときに、例外がスローされるのを待ちません。

  3. 1 行に最小限の操作 (たとえば 1 または 2) を実行するようにしてください。そうでない場合は、単一行の式のどこでNullPointerException発生したかを調べる必要があります。

  4. null状態を示すためにフィールドで使用しないでください。代わりに、たとえば an を使用しenum Stateます。たとえば、後でif (socket == null) { // not connected }チェックするのを忘れやすいので、やらないでください。null明示的な状態はそう簡単には忘れられません。

  5. null明示的に必要でない限り、ローカル変数を に初期化しないでください。実際、スコープと例外を正しく処理すれば、ほとんどの変数をマークできるはずですfinal。コード ブロックの終了点と見なされるため、既定のprintStacktrace()メソッドを置き換えると役立ちます。throw new IllegalStateException("Unhandled program state", e)

多くのプログラミングの後、 の数が減少することがわかりますNullPointerException

于 2013-07-26T02:27:53.320 に答える