Eclipse Junoでnull解析を行う
Eclipse Juno(4.2)から、@Nullable
が付いたパラメータを、そのメソッド内でNullチェックしていない場合はwarningやerrorにすることが出来るようになります。
@Nullable
Nullableアノテーションがついているパラメータは、そのパラメータにはNullが渡されることも許容するという意味になります。
なので、メソッド内で値のNullチェックを行う必要があります。
例えば、以下のようなコードを書いたとします。
import static org.junit.Assert.assertEquals;
import javax.annotation.Nullable;
import org.junit.Test;
public class NullableTest {
@Test
public void test() {
assertEquals("ABC", toUpper("abc"));
}
private String toUpper(@Nullable String param) {
return param.toUpperCase();
}
}
このtoUppserメソッドはparam
パラメータのNullチェックをしていないので、NullPointerExceptionを起こす可能性があります。
そういったチェックは↑の画像のように静的にコンパイラがチェックしてくれると、実行時エラーを未然に防げて嬉しいです。
というようにこの機能は素敵なのですが、デフォルトの設定ではNullableはNullableでもorg.eclipse.jdt.annotation.Nullable
のアノテーションのみが対象となっています。
さすがに、Eclipseプラグインでもなんでもないコードにorg.eclipseのNullableを使うのは嫌ですが、そこは設定で変更できます。
使用するNullableクラスの設定
Preferencesの「Java > Compiler > Errors/Warnings」の一番下に「Null analysis」という項目があります。
その項目の中の「Enable annotation-basd null inference」にチェックを入れ、その下の方の「Configure」を押します。
そうすると、↓の様にnull解析で使用するアノテーションのクラスを指定できるようになるので、ここでNullableにjavax.annotation.Nullableを、NonNullにjavax.annotation.Nonnullを指定しておきます。
これで、あとは各メソッドのパラメータに@Nullable
や@Nonnull
をつけていくだけで、null解析が実行されるようになります。
おまけ
(2013/06/05)
こちらの内容は@bleisさん、@uasiさんより、@NullableなのにcheckNotNullしちゃうのは意味が無いと指摘いただいたので取り消させて頂きます。@bleisさん、@uasiさん、ご指摘ありがとうございます。
@Nullable
パラメータのNullチェックに毎回if文を書いていては面倒ですし、コードも無駄に長くなってしまいます。
そういう時は、guava libraryのPreconditions.checkNotNullを使うと以下のように簡単にnullチェックが書けて幸せになれます。
private String toUpper(@Nullable String param) {
return checkNotNull(param).toUpperCase();
}
そのあたりはこちらにまとめました。
メソッド内でパラメータの値チェックを行う