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();
}
この時点で、personがnullの場合、getAgeがNullPointerExceptionをスローすることがわかります。
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で利用できます。