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

Why @Nonnull annotation checked at runtime?

我有一个具有以下签名的函数

public static String myFunction(@Nonnull String param)

当我用参数为 null 调用它时,出现以下异常:

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

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

究竟是谁抛出了异常,为什么?

P.S。我 运行 Tomcat 服务器处于调试模式,来自 IntelliJ IDEA 2016.3 和 Oracle JDK 1.8.0_102

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

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