次のような呼び出しで NullPointerException を取得した場合:
someObject.getSomething().getSomethingElse().
getAnotherThing().getYetAnotherObject().getValue();
次のようなかなり役に立たない例外テキストが表示されます。
Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)
どの呼び出しが実際に null を返したかを見つけるのはかなり難しく、コードを次のようにリファクタリングしていることがよくあります。
Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();
そして、どの行を探すべきかを教えてくれるよりわかりやすい NullPointerException を待ちます。
ゲッターを連結するのは悪いスタイルであり、とにかく避けるべきだと主張する人もいるかもしれませんが、私の質問は次のとおりです。コードを変更せずにバグを見つけることはできますか?
ヒント: 私は Eclipse を使用しており、デバッガーが何であるかは知っていますが、それを問題に適用する方法がわかりません。
回答に対する私の結論:
いくつかの回答は、ゲッターを次々とチェーンするべきではないと教えてくれました。いくつかの回答は、そのアドバイスに従わなかった場合にコードをデバッグする方法を示しました。
いつゲッターをチェーンするかを正確に教えてくれた答えを受け入れました:
- null を返すことができない場合は、好きなだけ連鎖させます。!= null をチェックする必要はありません。NullPointerExceptions について心配する必要はありません (連鎖は依然としてデメテルの法則に違反していることに注意してください。しかし、私はそれを受け入れることができます) 。
- それらが null を返す可能性がある場合は、絶対に連鎖させず、null を返す可能性のあるそれぞれについて null 値のチェックを実行
これにより、実際のデバッグに関する適切なアドバイスは役に立たなくなります。