Edited at

Eclipse Junoでnull解析を行う

More than 5 years have passed since last update.

Eclipse Junoでnull解析を行う

Eclipse Juno(4.2)から、@Nullableが付いたパラメータを、そのメソッド内でNullチェックしていない場合はwarningやerrorにすることが出来るようになります。

http://download.eclipse.org/eclipse/downloads/drops4/R-4.2-201206081400/news/eclipse-news-part2.html#annotation-null-analysis


@Nullable

Nullableアノテーションがついているパラメータは、そのパラメータにはNullが渡されることも許容するという意味になります。

なので、メソッド内で値のNullチェックを行う必要があります。

例えば、以下のようなコードを書いたとします。


NullableTest.java

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を起こす可能性があります。

error

そういったチェックは↑の画像のように静的にコンパイラがチェックしてくれると、実行時エラーを未然に防げて嬉しいです。

というようにこの機能は素敵なのですが、デフォルトの設定では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チェックが書けて幸せになれます。


nullable

    private String toUpper(@Nullable String param) {

return checkNotNull(param).toUpperCase();
}

そのあたりはこちらにまとめました。

メソッド内でパラメータの値チェックを行う