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 .