Рубрики
Без рубрики

Использование Null Away, чтобы избежать NullPointerExceptions

Узнайте, как избежать NullPointerExceptions, используя Null Away.

Автор оригинала: baeldung.

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 .