1. 概要

アプリからNullPointerExceptionを削除するために、エルビス演算子からオプションまで、長年にわたって数多くの戦略に取り組んできました。 このチュートリアルでは、会話へのUberの貢献、 NullAway 、およびその使用方法について学習します。

NullAwayは、Javaコードの NullPointerException (NPE)を排除するのに役立つビルドツールです。

このツールは、一連の型ベースのローカルチェックを実行して、コードで逆参照されるポインターがnullにならないようにします。 ビルド時間のオーバーヘッドが低く、コードのすべてのビルドで実行するように構成できます。

2. インストール

NullAwayとその依存関係をインストールする方法を見てみましょう。 この例では、Gradleを使用してNullAwayを構成します。

NullAwayは、エラーが発生しやすいに依存しています。 したがって、errorproneプラグインを追加します。

plugins {
  id "net.ltgt.errorprone" version "1.1.1"
}

また、異なるスコープに4つの依存関係を追加します: annotationProcessor compileOnly errorprone、 errorproneJavac

dependencies {
  annotationProcessor "com.uber.nullaway:nullaway:0.7.9"
  compileOnly "com.google.code.findbugs:jsr305:3.0.2"
  errorprone "com.google.errorprone:error_prone_core:2.3.4"
  errorproneJavac "com.google.errorprone:javac:9+181-r4173-1"
}

最後に、コンパイル中にNullAwayがどのように機能するかを構成するGradleタスクを追加します。

import net.ltgt.gradle.errorprone.CheckSeverity

tasks.withType(JavaCompile) {
    options.errorprone {
        check("NullAway", CheckSeverity.ERROR)
        option("NullAway:AnnotatedPackages", "com.baeldung")
    }
}

上記のタスクは、NullAwayの重大度をエラーレベルに設定します。これは、エラーでビルドを停止するようにNullAwayを構成できることを意味します。 デフォルトでは、NullAwayはコンパイル時にユーザーに警告するだけです。

さらに、タスクは、nullの逆参照がないかチェックするパッケージを設定します。

これで、Javaコードでツールを使用する準備が整いました。

同様に、他のビルドシステム、MavenまたはBazel を使用してツールを統合できます。

3. 使用法

age属性を含むPersonクラスがあるとします。 さらに、Personインスタンスをパラメーターとして受け取るgetAgeメソッドがあります。

Integer getAge(Person person) {
    return person.getAge();
}

この時点で、personnullの場合、getAgeNullPointerExceptionをスローすることがわかります。

NullAwayは、すべてのメソッドパラメータ、戻り値、およびフィールドが非であると想定します -ヌル。 したがって、それは期待します非インスタンスであるヌル

また、コードのどこかに、実際にnull参照をgetAgeに渡す場所があるとしましょう。

Integer yearsToRetirement() {
    Person p = null;
    // ... p never gets set correctly...
    return 65 - getAge(p);
}

次に、ビルドを実行すると、次のエラーが発生します。

error: [NullAway] passing @Nullable parameter 'null' where @NonNull is required
    getAge(p);

@Nullable アノテーションをパラメーターに追加することで、このエラーを修正できます。

Integer getAge(@Nullable Person person) { 
    // ... same as earlier
}

ビルドを実行すると、新しいエラーが表示されます。

error: [NullAway] dereferenced expression person is @Nullable
    return person.getAge();
            ^

これは、personインスタンスがnullである可能性があることを示しています。 標準のnullチェックを追加してこれを修正できます。

Integer getAge(@Nullable Person person) {
    if (person != null) {
        return person.getAge();
    } else {
        return 0;
    }
}

4. 結論

このチュートリアルでは、NullAwayを使用してNullPointerExceptionが発生する可能性を制限する方法について説明しました。

いつものように、すべてのソースコードはGitHub利用できます。