情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

Eclipseの警告「Null comparison always yields false: The variable node cannot be null at this location」が出るパターン例メモ

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」という警告が表示されます。

コメント(0)

新しいコメントを投稿