1. Обзор
На протяжении многих лет мы применяли множество стратегий, от операторов Elvis до Optional , чтобы помочь удалить NullPointerException s из наших приложений. В этом уроке мы узнаем о вкладе Uber в разговор Null Away и о том, как его использовать.
Null Away-это инструмент сборки, который помогает нам устранить Исключение NullPointerException s (NPE) в нашем Java-коде.
Этот инструмент выполняет серию локальных проверок на основе типов, чтобы убедиться, что любой указатель, разыменованный в коде, не может быть null . Он имеет низкие затраты времени на сборку и может быть настроен для запуска в каждой сборке вашего кода.
2. Установка
Давайте посмотрим, как установить Null Away и его зависимости. В этом примере мы собираемся настроить Null Away с помощью Gradle.
Null Away зависит от Подвержен ошибкам . Поэтому мы добавим подверженный ошибкам плагин:
plugins {
id "net.ltgt.errorprone" version "1.1.1"
}Мы также добавим четыре зависимости в разных областях: процессор аннотаций , Только компиляция , подвержен ошибкам, и 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"
}
Наконец, мы добавим задачу Gradle, которая настраивает работу Null Away во время компиляции:
import net.ltgt.gradle.errorprone.CheckSeverity
tasks.withType(JavaCompile) {
options.errorprone {
check("NullAway", CheckSeverity.ERROR)
option("NullAway:AnnotatedPackages", "com.baeldung")
}
}Вышеприведенная задача устанавливает серьезность NullAway на уровень ошибки, что означает, что мы можем настроить NullAway для остановки сборки с ошибкой. По умолчанию Null Away просто предупредит пользователя во время компиляции.
Кроме того, задача устанавливает пакет для проверки на разыменование null.
И все, теперь мы готовы использовать этот инструмент в нашем Java-коде.
Аналогично, мы можем использовать другие системы сборки , Maven или Bazel , для интеграции инструмента.
3. Использование
Допустим, у нас есть класс Person , содержащий атрибут age . Кроме того, у нас есть метод getAge , который принимает экземпляр Person в качестве параметра:
Integer getAge(Person person) {
return person.getAge();
}На этом этапе мы видим, что get Age вызовет NullPointerException , если person является null .
Null Away предполагает, что каждый параметр метода, возвращаемое значение и поле не являются -null. Поэтому он будет ожидать, что экземпляр person не будет 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. Выводы
В этом уроке мы рассмотрели, как мы можем использовать Null, чтобы ограничить возможности возникновения NullPointerException s.
Как всегда, весь исходный код доступен на GitHub .