型アノテーションの活用例として、前回Checker Frameworkを紹介しました。今回は、Checker Frameworkを使用して、実際にコード解析をしてみましょう。

 はじめに紹介するのがnullに対するチェックを行う、Nullness Checkerです。

Nullness Checker

 プログラムの障害には様々な種類がありますが、その中でもNullPointerException例外はよく遭遇する障害ではないでしょうか。

 NullPointerException例外を防ぐには、nullでないかどうかをこまめにチェックすることや、Optionalクラスを使うようにするなどの対処法があります。Optionalクラスについては、本連載のnullチェックの煩雑さを解決、Java SE 8で導入されたjava.util.Optionalクラスをご参照ください。

 とはいうものの、頻繁にnullチェックを記述することや、Optionalクラスを使用することにより、コードが煩雑になりがちです。

 そこで、登場するのがChecker FrameworkのNullness Checkerです。Nullness Checkerでは、nullを扱わない場合と、nullになるかもしれない場合を明確に分けるようにします。

 nullを扱わない場合、@NonNullアノテーションで修飾します。一方のnullになるかもしれない場合は@Nullableアノテーションで修飾します。この2つのアノテーションがNullness Checkerの最も基本となるアノテーションです。

 リスト1はメソッドの返り値に対して@NonNullアノテーションと@Nullableアノテーションを付加した例です。

リスト1●@NonNullアノテーション、@Nullableアノテーションの使用例

public @NonNull String sayHello() {
    return "Hello, World!";
}

public @Nullable String sayGoodNight() {
    if (Math.random() < 0.5) {  
        return "Good Night, World!";
    } else {
        return null;
    }
}

 sayHelloメソッドはnullを返すことはありません。そのため、@NonNullアノテーションを付加してあります。一方のsayGoodNightメソッドはnullを返すことがあります。そこで、@Nullableメソッドで修飾しています。

 もちろん、通常はこんなメソッドを書くことはないはずですが、あくまでも例ということでご了承ください。