2016-11-28 177 views
37

我有一个函数具有以下签名为什么在运行时检查@Nonnull注释?

public static String myFunction(@Nonnull String param) 

当我把它用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中,但当时它仅支持JetBrains的'@NotNull'注释。最近添加了对其他注释的支持。 – yole

+28

因此,奇妙的是编译代码与构建工具链不同。这在很多层面上都是错误的。例如,这可能会导致从IntelliJ运行时单元测试失败,但通过maven运行时通过。也许用户有一个空检查和特定的异常抛出,单元测试验证异常和消息,但是这会阻碍。 –