为什么在运行时检查@Nonnull注释?

Dmi*_*try 54 java intellij-idea non-nullable

我有一个具有以下签名的功能

public static String myFunction(@Nonnull String param)
Run Code Online (Sandbox Code Playgroud)

当我用param调用它为null时,我得到以下异常:

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) 
Run Code Online (Sandbox Code Playgroud)

不应该在运行时检查javax.annotation.Nonnull.

谁真的抛出异常,为什么?

PS我使用Oracle JDK 1.8.0_102从IntelliJ IDEA 2016.3以调试模式运行Tomcat服务器

yol*_*ole 82

在IntelliJ IDEA中编译项目时,它会检测已编译类的字节码,以便为各种@Nonnull注释添加运行时检查.此行为由选项控制:

设置| 构建,执行,部署| 编译器| [x]为非空注释的方法和参数添加运行时断言.

  • 因此,奇妙的是,它将编译与构建工具链不同的代码.在如此多的层面上这是错误的.例如,这可能导致单元测试在从IntelliJ运行时失败,但在通过maven运行时传递.也许用户有一个空检查和抛出的特定异常,单元测试验证该异常和消息,但这会妨碍. (39认同)
  • 我认为这是一个错误.注释并不意味着运行时检查,任何隐式添加运行时检查的构建都违反了没有运行时检查的注释契约.他们在想什么?更糟糕的是,他们选择退出而不是选择加入. (9认同)
  • 他们,如果你不喜欢这个功能,就禁用它.处理空值是我在Java中遇到的最大痛点之一.感谢IntelliJ在这里伸出援助之手. (9认同)
  • 此功能已在IntelliJ IDEA 5.0中添加,但当时它仅支持JetBrains的"@NotNull"注释.最近增加了对其他注释的支持. (4认同)
  • 是否有可能在maven中获得这些运行时检查(没有lombok)? (2认同)
  • @Jatin 尝试 https://github.com/osundblad/intellij-annotations-instrumenter-maven-plugin 来获取 Maven 中的运行时 null 检查。默认情况下,它仅适用于 JetBrains 注释。 (2认同)