私はEclipseを使用し、Javaでプログラミングしています。何時間も悩まされる nullPointerException に出くわすことがあります。とにかくnullPointerExceptionsをよりよくデバッグし、変数値とは何か、およびnull Pointer Exceptionsの原因となるその他のものを把握する方法はありますか?
3 に答える
スタック トレースを見て、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 でも同じことができます。例外がスローされたときのブレークポイントを設定し、それを使用してメソッドのパラメーターを調べます。私はここでは原始的です。なぜなら、最初に困難な方法でそれを行うことを学べば、誰もがより良くなると心から信じている考え方の学校から来たからです。漏れやすい抽象化とそのすべて。
NullPointerException
問題を軽減する方法がいくつかあります。
@Nullable アノテーションを使用します。
null
コンストラクターとセッターで引数の値をテストします(単純な古い Java コードのセッターは避けてください)。これを何度も行うと、(Eclipse) ソース コード テンプレートを作成してコードをすばやく生成できます。これは「フェイルファスト」と呼ばれます。フィールドに値を格納した後など、値がコード内でさらに使用されているときに、例外がスローされるのを待ちません。1 行に最小限の操作 (たとえば 1 または 2) を実行するようにしてください。そうでない場合は、単一行の式のどこで
NullPointerException
発生したかを調べる必要があります。null
状態を示すためにフィールドで使用しないでください。代わりに、たとえば an を使用しenum State
ます。たとえば、後でif (socket == null) { // not connected }
チェックするのを忘れやすいので、やらないでください。null
明示的な状態はそう簡単には忘れられません。null
明示的に必要でない限り、ローカル変数を に初期化しないでください。実際、スコープと例外を正しく処理すれば、ほとんどの変数をマークできるはずですfinal
。コード ブロックの終了点と見なされるため、既定のprintStacktrace()
メソッドを置き換えると役立ちます。throw new IllegalStateException("Unhandled program state", e)
多くのプログラミングの後、 の数が減少することがわかりますNullPointerException
。