javax.annotation: @Nullable против @CheckForNull

Какая разница между двумя? Оба, кажется, означают, что значение может быть нулевым, и с ним следует обращаться соответствующим образом, т.е. проверять на нуль.

Обновление: две приведенные выше аннотации являются частью JSR-305/FindBugs: http://findbugs.sourceforge.net/manual/annotations.html


person vitaly    schedule 06.09.2012    source источник
comment
Я не думаю, что эти аннотации исходят из API Java Bean Validation. Какую библиотеку/фреймворк вы используете? Разве у него нет документации для его аннотаций?   -  person Shivan Dragon    schedule 06.09.2012
comment
Ни один из них не является частью обычного Java API. Где они реализованы?   -  person vainolo    schedule 06.09.2012
comment
Обновил описание. Это часть JSR-305, и я использую реализацию FindBugs.   -  person vitaly    schedule 06.09.2012
comment
стоит отметить, что ошибка переопределяет параметр @Nullable sourceforge.net/p/findbugs/bugs/1139 был исправлен в findbugs. Таким образом, мы можем переопределить его с помощью \@Nonull в реализациях.   -  person Ronan Quillevere    schedule 17.01.2014
comment
эти методы также являются частью структуры коллекции Guava.   -  person Dinesh ML    schedule 12.11.2015


Ответы (3)


Я думаю, из добавленной вами ссылки довольно ясно: если вы используете @CheckForNull, а код, использующий это значение, не проверяет null, FindBugs покажет это как ошибку.

FindBugs будет игнорировать @Nullable.

На практике эта аннотация полезна только для переопределения всеобъемлющей аннотации NonNull.

Используйте @CheckForNull в тех случаях, когда значение всегда должно проверяться. Используйте @Nullable, где null может подойти.

РЕДАКТИРОВАТЬ: кажется, что @CheckForNull на данный момент плохо поддерживается, поэтому я предлагаю избегать его и использовать @NonNull (также см. should-i-use">Какую аннотацию @NotNull Java следует использовать?). Другой идеей было бы связаться напрямую с разработчиками FindBugs и узнать их мнение о несоответствии в документации.

person lbalazscs    schedule 06.09.2012
comment
Единственное предупреждение, которое я получил от FindBugs после запуска кода из ответа Александра, это nonnull() may return null, but is declared @NonNull At test.java:[line 19] In method com.db.icestation.test.nonnull() Описания ошибок: Method may return null, but is declared @NonNull. This method may return a null value, but the method (or a superclass method which it overrides) is declared to return @NonNull. Bug kind and pattern: NP - NP_NONNULL_RETURN_VIOLATION - person vitaly; 06.09.2012
comment
Я не могу найти упоминания @CheckForNull здесь: findbugs.sourceforge.net/bugDescriptions.html ( @NonNull там) - person vitaly; 07.09.2012
comment
@vitaly — FindBugs 2.0.1 сообщает о нарушении @CheckForNull как NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE. - person David Harkness; 15.09.2012
comment
@Nullable специально указывает FindBugs игнорировать возможность null так же, как это делается для всех ссылок без аннотаций. Я считаю, что вам никогда не придется использовать его, за исключением, возможно, работы со сторонним кодом, который вы не можете изменить. - person David Harkness; 15.09.2012
comment
@DavidHarkness Извините, я не совсем уверен, что смогу следовать. Аннотация @Nullable помогает в таких случаях, как System.out.println(new test().nullable().length()); из кода Алекса. Если я правильно понимаю, это специально указывает FindBugs проанализировать возможность null. - person vitaly; 17.09.2012
comment
@vitaly — Из обзора аннотаций nullness, Билл Пью сказал следующее о @Nullable: поскольку мы допускаем аннотации по умолчанию, у нас также должна быть аннотация, которая [является] точно такой же, как и отсутствие нулевой аннотации любого вида. Внизу он заявляет, что цель состоит в том, чтобы разрешить использование инструментов различной строгости. - person David Harkness; 17.09.2012

@Nonnull и @Nullable корректно обрабатываются IntelliJ IDEA. FindBugs обнаружил проблему с @Nonnull, но пропустил проблемы с @Nullable и @CheckForNUll. Проблемы, обнаруженные IDEA и FindBugs, отмечены комментариями.

package com.db.icestation;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class test {

    @Nullable public String nullable() {
        return "";
    }

    @Nonnull public String nonnull() {
        return null; // IDEA, findbugs
    }

    @CheckForNull public String checkForNull() {
        return null;
    }

    public static void main(String[] args) {
        System.out.println(new test().nullable().length()); // IDEA
        System.out.println(new test().nonnull().length());
        System.out.println(new test().checkForNull().length());
    }
}
person Alexander Pavlov    schedule 06.09.2012
comment
Eclipse находит точно такие же, при условии, что он настроен на выполнение «нулевого анализа» и использует правильные аннотации (по умолчанию он использует аннотации JDT, а не JSR-305). Интересно, что для аннотации @CheckForNull нет конфигурации (но есть @NonNullByDefault). - person vitaly; 06.09.2012
comment
FindBugs 2.0.1 обнаруживает случай @CheckForNull: возможное разыменование нулевого указателя из-за возвращаемого значения вызываемого метода. - person David Harkness; 15.09.2012
comment
@DavidHarkness - я не могу воспроизвести это, используя 2.0.1: github.com/lischenko/flaming-ninja (см. findbugs.null.analysis). findbugs-maven-plugin=v2.5.2 - последняя версия, аннотации=2.0.1 - person vitaly; 17.09.2012
comment
@vitaly — я использую плагин Software Quality Environment для NetBeans, который включает FindBugs, и сообщение помечается как исходящее от FindBugs. Я включил версию 2.0.1 в свой проект, чтобы получить аннотации, но, возможно, плагин включает более старую версию (которая работает). - person David Harkness; 17.09.2012
comment
@vitaly - я установил FB 2.0.1 и убедился, что он неправильно определяет аннотацию @CheckForNull. Я не могу понять, какую версию FB использует плагин SQE. - person David Harkness; 18.09.2012
comment
Если вы используете аннотацию JetBrains @NotNull, IDEA дополняет код дополнительными проверками во время выполнения, но если вы используете @Nonnull, этого не происходит. Я не знаю, как другие, но, на мой взгляд, это довольно далеко от правильного обращения. - person Trejkaz; 22.06.2015

В IntelliJ Idea @javax.annotation.Nullable поддерживается по умолчанию, и любые попытки разыменования @Nullable аргументов или возвращаемых значений приведут к предупреждению.

@alexander-pavlov, вы можете добавить @javax.annotation.CheckForNull в конфигурацию проверки «Постоянные условия и исключения». Перейдите в Файл->Настройки->Проверки->Вероятные ошибки->Постоянные условия и исключения->Настроить аннотации.

Я предпочитаю делать это, так как @CheckForNull имеет более четкое значение, чем @Nullable, как @lbalazscs упомянул в своем ответе выше.

person Ilya Silvestrov    schedule 20.09.2012