スポンサーリンク
Java + Eclipseで見慣れない「Null comparison always yields false」という警告が現れたので、それについてメモします。優秀な警告でした。
目次
スポンサーリンク
「Null comparison always yields false」が現れたコード
下の「node == null」に黄色い波線が引かれ、「Null comparison always yields false: The variable node cannot be null at this location」という警告が表示されました。
if (node == null) { throw new IllegalArgumentException(); }
そして、「throw new IllegalArgumentException();」のところについては、「Dead code」が表示されます。
さて、どうして「絶対にnullにならないから、このチェックは無意味だよ」と警告されてしまったのでしょうか。
原因:先にNull Pointer Exceptionが出る
もちろん、原因はこのコードだけでは分かりません。このコードの周辺に原因がありました。
このコードは引数チェックだったので、呼び出し側が絶対にnullを渡さないようなコードになっているのでは、とも思いましたが、そんなことで警告してしまっては危険であって、実際にはその直前のコードに原因がありました。
直前のコードも含めると、このようになっていました。
if (index < 0 || node.size() <= index) { throw new IllegalArgumentException(); } if (node == null) { throw new IllegalArgumentException(); }
原因は、「node.size()」でした。このコード自体が、「nodeはnullではない」という前提の元に成り立っているため、node == nullは不要だと指摘されてしまっていたようです。もしnullなら、node == null以前にNullPointerExceptionが投げられてしまうはず、というわけです。
実際的には、この2つのifの順番が悪い(逆だ)ということを指摘してくれていたことになります。
変数の変更の可能性があると表示されない
「node」オブジェクトのメソッドが呼ばれてから、node変数に変更(代入)の可能性がある場合は、このエラーは表示されず、ちゃんとチェックされているようです。
逆に、ifとifの間の行に「node = null」を挿入しておくと、「Redundant null check: The variable node can only be null at this location」という警告が表示されます。
スポンサーリンク
スポンサーリンク