2016-10-20 6 views
2

fooのケースを正常に処理するように設計されたアプリケーションをデバッグしています。nullです。しかし、生産からログをチェックするときに、fooの方法にアクセスしようとすると、NullPointerExceptionが正常に処理された後にスローされました。 foo.getBar()を呼び出すとき`foo == null`が` foo`が本当にnullのときには、どんな状況でもfalseである可能性がありますか?

それは代わりにそのコードを持つので、この

if (foo == null) { 
    throw new GracefulException(); 
} 

Bar bar = foo.getBar(); 

のように見える、NullPointerExceptionは生産で発生しました。

私の質問はこれだけです:このようなファンキーな行動を聞いたことがある人はいますか?もしそうなら、それを引き起こす原因は何ですか?

+3

いいえ。これはできません。私のお金はひどく書かれた 'try ... catch'です。 –

+1

完全なスタックトレースを追加できますか? – NilsH

+0

@NilsH私が質問に投稿したコードは、実際の生産コードの非常に抽象化された例です。スタックトレースは、実際のコードを反映するようにサンプルコードを大幅に拡張しないと、行番号を変更してスタックトレースから機密情報を削除する作業をしない限り役に立たなくなります。 – zero01alpha

答えて

7

コールスタックをチェックします。内部から来ている可能性がありますgetBar()

また、fooがローカル変数でない場合、他のスレッドによってifの後にnullに設定されることがあります。 foonullある場合

+0

'foo'はローカル変数ですが、セッションデータを取得する静的ヘルパークラスから値を取得します。これはTomcatサーバー上で実行されているWebアプリケーションです。私は 'getBar()'からコールスタックをチェックできないのかどうかはわかりません。なぜなら、私はこれが起こっている証拠だけが未処理の例外のスタックトレースだけをダンプするログファイルだからです。私がそれが 'foo.getBar()'から来ていることを知っている唯一の理由は、それがスタックトレースで指定された行番号で起こっている唯一のものだからです。 – zero01alpha

+3

@ zero01alpha 'foo'がローカル変数である場合、これらのコード行の間で更新することはできません。 –

+0

'getBar()'を呼び出す試みが 'NullPointerException'の結果になったときに、' getBar() 'から何かが来る可能性がありますか?私の知識不足を許してください。 – zero01alpha

1

foo == nullは、falseになることはありません。

これらの可能なケースが考えられます。

  1. アプリケーションがマルチスレッドで、fooが正しく同期されていない共有フィールドです。この場合、同期が必要です。 fooはローカル変数なので、ここではこのケースは適用されません。
  2. 例外が内部から来ていますfoo.getBar()。この場合は、スタックトレースが生成されることで簡単に識別できます。メソッド名がスタックトレースに存在するかどうかを確認してください。たとえば、

はコードの下に考慮してください。

public class Temp { 
    public static void main(String[] args) { 
     new Temp().functionA(); 
    } 

    void functionA() { 
     Foo foo = new Foo(); 
     //foo = null; //Line 1 
     String str = foo.getBar(); 
    } 
} 

class Foo { 
    Object x = new Object(); 

    public String getBar() { 
     //x = null; //Line 2 
     return x.toString(); 
    } 
} 

fooは、(1行目はコメントしていない)nullある場合は、スタックトレースは次のようになります:xnullある場合

Exception in thread "main" java.lang.NullPointerException 
at Temp.functionA(Temp.java:9) 
at Temp.main(Temp.java:3) 

(行2はコメントされていません)、スタックトレースは次のようになります:

Exception in thread "main" java.lang.NullPointerException 
at Foo.getBar(Temp.java:16) 
at Temp.functionA(Temp.java:8) 
at Temp.main(Temp.java:3) 
1

スタックトレースにfoo.getBar()が記載されている場合、そのメソッド内で例外がスローされ、間違った場所が表示されます。

スタックトレースの先頭がこのfoo.getBar()コールを含むメソッドの場合、foonullです。

あなたはfooがローカル変数であることを書くので、これはないによる干渉、他のスレッドにです - 別のスレッドが(それを行うことができますほとんどが、それはコンテンツだ修正です)、ローカル変数の値を設定することはできません。チェックとメソッド呼び出しの間nullfooを設定声明はありませんことを

  • チェック。
  • チェックを避ける方法がないことを確認してください(つまり、チェックが条件付きブロックにないこと)。
  • チェックとメソッド呼び出しの間にキャッチブロックがないことを確認してください。GracefulException
関連する問題