2016-11-28 4 views
37

У меня есть функция со следующей подписьюПочему аннотация @Nonnull проверяется во время выполнения?

public static String myFunction(@Nonnull String param) 

Когда я называю его парами как нулевые, я получаю следующее исключение:

Caused by: java.lang.IllegalArgumentException: Argument for @Nonnull parameter 'param' of com/MyClass.myFunction must not be null 
    at com.MyClass.$$$reportNull$$$0(MyClass.java) 

javax.annotation.Nonnull предполагается не должны быть проверено во время выполнения ,

Кто на самом деле выбрасывает исключение и почему?

P.S. Я бег сервера Tomcat в режиме отладки из IntelliJ IDEA 2016.3 с Oracle JDK 1.8.0_102

+0

На самом деле @Jesper, эти новые аннотации были сделаны так: проверьте вещи во время компиляции. Вы можете проверить мой ответ .. «Когда вы компилируете код, в том числе модуль NonNull в командной строке, компилятор выводит предупреждение, если обнаруживает потенциальную проблему» – BrunoDM

+2

@BrunoDM - это исключение во время выполнения – Dmitry

ответ

58

При компиляции проекта в IntelliJ IDEA, это инструменты байткода скомпилированных классов, чтобы добавить проверки во время выполнения для различных вкусов @Nonnull аннотаций. Такое поведение контролируется опцией:

Настройки | Создание, выполнение, развертывание | Компилятор | [x] Добавить утверждения времени выполнения для не-нуль-аннотированных методов и параметров.

+1

В какой версии IDEA это была добавлена ​​функция? – Dmitry

+3

Эта функция была добавлена ​​в IntelliJ IDEA 5.0, но в то время она поддерживала только аннотации '@ NotNull' JetBrains. Недавно была добавлена ​​поддержка других аннотаций. – yole

+28

Итак, он чудесно скомпилирует код, отличный от цепочки инструментов построения. Это неверно на многих уровнях. Это может привести к сбою модульных тестов при запуске из IntelliJ, но, например, при передаче через maven. Возможно, пользователь имеет нулевую проверку и конкретное исключение, и модульные тесты проверяют это исключение и сообщение, но тогда это мешает. –

Смежные вопросы