2013-07-26 6 views
16

私はJavaでEclipseとプログラミングを使用しています。時々私はnullPointerExceptionに遭遇し、数時間私を悩ますでしょう。とにかくnullPointerExceptionsをデバッグして、どのような変数値があるのか​​、そしてnullポインタ例外を引き起こす他のものを見つけ出していますか?nullPointerExceptionをデバッグする良い方法

+2

スタックトレースを見て...それはラインがNPEを投げたかを示して、あなたが置くことができますそこにブレークポイントがあり、どの変数がヌルであるかを確認してください。 – chancea

+0

NPEをデバッグする方法を学ぶ最も良い方法は、デバッグを続けることです。あなたは時間をかけてそれを良くするでしょう。しかし、鍵は、どこで発生しているのかを調べ、変数をチェックすることです。ここには魔法はありません。 –

+1

あなたのコードに 'assert'文を置くことができます – MadProgrammer

答えて

22

スタックトレースを調べて、NullPointerExceptionがスローされた行番号を読み取ります。ほとんど常に、ラインはxnullある場合は、あなたがNullPointerExceptionを得る

x.getValue() 

のようないくつかのメソッド呼び出しを持っています。スタックトレースの最上位にあるメソッドがあなたのコードでない場合は、コードに達するまで、スタックを完全にトレースしてください。このケースでは、nullのパラメータを好きではないメソッドにnullを渡すことがよくあります。見つけて修正してください。

さらに、NullPointerExceptionを投げている方法ではない場合、ドキュメントをお読みください。例えば、String.replace(CharSequence target, CharSequence replacement)を見て:

例外:

NullPointerExceptionからtargetreplacementnullある場合。

これ以上はっきりしません。

は、ここに例を示します

enter image description here

は4行目を見ると、私たちは foo.bar()を参照してください。これは、 foonullであることを意味します。それは簡単です。別の例を見てみましょう:

enter image description here

コードに遡っ、我々はs.replace(target, replacement)が投げていることがわかります。我々はtargetreplacementを調べるべきです。のは、デバッガをアタッチしてみましょう:

enter image description here

なるほど! replacementnullです。 Eclipseでも同じことができます。例外がスローされたときにブレークポイントを設定し、それを使用してメソッドへのパラメータを検査します。私はここで原始的です。なぜなら、まずは難しい方法を最初にやることを学んだら、皆がもっと良くなると本当に信じている思考の学校から来たからです。リーキー抽象化とそのすべて。

+2

フリーハンドのサークルを使った例やスクリーンショットは素晴らしいでしょう:) – hexafraction

+1

私の問題は、関数(a、b、c、d、e)のような関数では、それらの変数のどれがnullであるかを教えてくれません。 –

+2

@六角形:またはより良い、円と矢印の付いた光沢のある写真の8x10と、それぞれが使用されるべきものを説明する段落の段落。 –

4

問題のNullPointerExceptionあまりを作るためにいくつかの方法があります。

  1. @Nullable annotationを使用してください。

  2. コンストラクタとセッタでnullの引数の値をテストします(一般的な古いJavaコードのセッタは避けてください)。これをたくさんすると、(Eclipse)ソースコードテンプレートを作成してコードをすばやく生成することができます。これは「フェイルファースト」と呼ばれ、値がコード内でさらに使用されているときに例外がスローされるのを待つことはありません。それをフィールドに保管した後。

  3. 1行に最低限の操作(例:1または2)を実行するようにしてください。あなたがしなければ、NullPointerExceptionが1行の式でどこに出現したのかを知る必要があります。

  4. 状態を示すフィールドにnullを使用しないでください。代わりに、例えばenum State。例えば。 nullを確認することを忘れやすいので、if (socket == null) { // not connected }を実行しないでください。明示的な状態は忘れにくいです。

  5. 明示的に必要な場合を除き、ローカル変数をnullに初期化しないでください。実際には、スコープと例外を正しく処理すると、ほとんどの変数にfinalをマークできるはずです。デフォルトのprintStacktrace()メソッドをthrow new IllegalStateException("Unhandled program state", e)に置き換えると、コードブロックの終了点として認識されるので便利です。

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

17
  1. あなたはヌル ポインタをキャプチャするために、BreakPointsビューを使用することができますデバッグ中。

    [ウィンドウ] - > [ビューの表示] - > [ブレークポイント

    ビューで"J!"あなたが 例外にブレークポイントを設定することができますことがあります。 java.lang.NullPointerExceptionを設定することができます。したがって、 ヌルポインタ例外がスローされると、どの変数が をnullにしているかを確認できます。

  2. あなたがコーディングしている間に可能なヌルポインタアクセスをキャプチャすることができます。オフコースでは、この設定を使用してすべてのヌルポインタをキャプチャできません。しかしそれでも役立つ、あなたの食の中で次の設定を設定します。

    設定 - > Javaの - >コンパイラ - >エラー/警告 - >ヌル分析

関連する問題