Eclipseを使用し、Javaでプログラミングしています。時々、nullPointerExceptionに遭遇し、何時間も悩まされます。とにかくnullPointerExceptionsをよりよくデバッグし、変数値とnull Pointer Exceptionsを引き起こす他のものを把握する方法はありますか。
スタックトレースを見て、NullPointerException
がスローされる行番号を読み取ります。ほとんどの場合、行には次のようなメソッド呼び出しがあります。
_x.getValue()
_
x
がnull
の場合、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でも同じことができます。例外がスローされたときにブレークポイントを設定し、それを使用してメソッドのパラメーターを検査します。私はここで原始的です。なぜなら、私が彼らが最初に苦労してそれをすることを学んだなら誰もがより良くなるだろうと本当に信じる考えの学校から来たからです。漏れやすい抽象化など。
デバッグ中にBreakPoints
ビューを使用して、nullポインターをキャプチャできます。
ウィンドウ->ビューの表示->ブレークポイント
ビューには、例外にブレークポイントを設定できる"J!"
があります。 Java.lang.NullPointerException
を設定できます。したがって、NULLポインター例外がスローされると、どの変数がNULLを引き起こしているかを確認できます。
他にできることは、コーディング中にヌルポインターアクセスの可能性をキャプチャすることです。コース外では、この設定を使用してすべてのヌルポインターをキャプチャすることはできません。それでも便利ですが、Eclipseで次の設定を行います。
設定-> Java-> Compiler-> Errors/warnings-> Null analysis
NullPointerException
の問題を減らすには、いくつかの方法があります。
@ Nullableアノテーション を使用します。
コンストラクターとセッターでnull
の引数の値をテストします(単純な古いJavaコード)のセッターを避けます。これを頻繁に行うと、(Eclipse)ソースコードを作成できます。これは「フェイルファスト」と呼ばれ、値がコードでさらに使用されているとき、たとえばフィールドに保存した後に例外がスローされるのを待ちません。
行ごとに最小限の操作(例:1または2)を実行するようにしてください。そうでない場合は、単一行の式のどこでNullPointerException
が発生したかを調べる必要があります。
状態を示すためにフィールドでnull
を使用しないでください。代わりに、例えば_enum State
_。例えば。後でnull
をチェックするのを忘れやすいので、if (socket == null) { // not connected }
をしないでください。明示的な状態を忘れることはそれほど簡単ではありません。
明示的に必要な場合を除き、ローカル変数をnull
に初期化しないでください。実際、スコープと例外を正しく処理すれば、ほとんどの変数final
をマークできるはずです。デフォルトのprintStacktrace()
メソッドをthrow new IllegalStateException("Unhandled program state", e)
に置き換えると、コードブロックの出口点と見なされるため、役立ちます。
多くのプログラミングを行うと、NullPointerException
sの数が減少することがわかります。