IntelliJ IDEA жалуется на нулевую проверку для параметра @NotNull

Я хочу использовать в своем проекте аннотации Jetbrains @ Nullable / @ NotNull.

скриншот

У меня есть класс с полем @NotNull. Конструктор, естественно, не принимает null, но вместо этого выдает исключение. Конечно, параметр этого конструктора также аннотируется @NotNull.

Почему IntelliJ IDEA жалуется на нулевую проверку? В документации указано:

Элемент, аннотированный с помощью NotNull, утверждает, что нулевое значение запрещено возвращать (для методов), передавать (параметры) и удерживать (локальные переменные и поля).

Но мне все равно нужно проверять нулевые значения во время выполнения, если система сборки не понимает аннотацию и принимает такой оператор, как new Car(null). Я ошибся?


person Euro    schedule 07.04.2015    source источник
comment
Сборка не удастся, если аннотации не существует, не так ли? В любом случае, IDE не имеет ни малейшего представления о том, что аннотации вам на самом деле наплевать. Если вы не хотите, чтобы он жаловался на нулевую проверку, отключите проверку.   -  person Dave Newton    schedule 07.04.2015
comment
Ну, наверное, с моей стороны это была плохая формулировка. Я тяну библиотеку аннотаций через gradle. Я имел в виду, что если система сборки не заботится об аннотации.   -  person Euro    schedule 07.04.2015


Ответы (3)


Если вы используете аннотацию JetBrains @NotNull, утверждения времени выполнения будут добавлены в ваш скомпилированный байт-код, который гарантирует, что null не будет передан туда. Тогда действительно нет смысла писать те же проверки в исходном коде. Этот подход нам подходит.

Если вы используете другие аннотации или просто не хотите инструментировать байт-код, вы можете отключить это конкретное предупреждение, нажав на нем Alt + Enter, «Изменить параметры проверки» и отметив «Игнорировать утверждения утверждения». Такие условные операторы обрабатываются средой IDE как утверждения.

person Peter Gromov    schedule 07.04.2015

Если параметр для конструктора - Not Null, то нет смысла проверять нулевое значение с помощью операторов и if.

И поскольку мы знаем, что любое значение, содержащееся в параметре Engine, не равно нулю, эта проверка всегда будет ложной.

Так что проверка, показанная на вашем скриншоте, будет иметь полный смысл. Если вы действительно не хотите видеть проверку нулевой проверки, отключите ее в разделе настроек.

Короче говоря, значение, которое вы проверяете, не является нулевым внутри конструктора, и IDE знает об этом.

person Raja Anbazhagan    schedule 07.04.2015
comment
Что ж, хотя аннотация используется для проверки вызывающего кода на предмет передачи нулей. Просто кажется неправильным опускать нулевую проверку и полагаться на конкретную IDE, чтобы избежать нулей. - person Euro; 07.04.2015
comment
Я просто не понимаю твоей точки зрения. Если вы отметили его как ненулевое, тогда зачем вам проверять на null? Внутри конструктора всегда не null, не так ли? - person Raja Anbazhagan; 07.04.2015
comment
И эта аннотация NotNull из Java 1.6 одинакова для любой IDE. Так что тебе не о чем беспокоиться - person Raja Anbazhagan; 07.04.2015
comment
Но что, если я скомпилирую свой проект на сервере сборки без IDE? Такой оператор, как new Car(null), отлично компилируется и, вероятно, приведет к неясным NPE во время выполнения в совершенно другом коде. - person Euro; 07.04.2015
comment
Аннотации, зависящие от IDE, не приветствуются. Ознакомьтесь с этим ответом stackoverflow.com/a/4963586/2557818 Доступно встроенное ограничение аннотации java. - person Raja Anbazhagan; 07.04.2015
comment
В этом есть смысл, спасибо! Я прочитаю больше по этой теме и постараюсь правильно перенести аннотации. - person Euro; 07.04.2015

Они ожидают, что вы будете использовать

        Objects.requireNonNull(engine, "engine");
person LSafer    schedule 30.06.2020