号foo == null
は、false
になることはありません。
これらの可能なケースが考えられます。
- アプリケーションがマルチスレッドで、fooが正しく同期されていない共有フィールドです。この場合、同期が必要です。
foo
はローカル変数なので、ここではこのケースは適用されません。
- 例外が内部から来ています
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
ある場合は、スタックトレースは次のようになります:x
がnull
ある場合
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)
いいえ。これはできません。私のお金はひどく書かれた 'try ... catch'です。 –
完全なスタックトレースを追加できますか? – NilsH
@NilsH私が質問に投稿したコードは、実際の生産コードの非常に抽象化された例です。スタックトレースは、実際のコードを反映するようにサンプルコードを大幅に拡張しないと、行番号を変更してスタックトレースから機密情報を削除する作業をしない限り役に立たなくなります。 – zero01alpha