【问题标题】:IntelliJ IDEA complains about null check for @NotNull parameterIntelliJ IDEA 抱怨 @NotNull 参数的空检查
【发布时间】:2015-04-07 17:41:18
【问题描述】:

我想在我的项目中使用 Jetbrains @Nullable/@NotNull Annotations。

我有一个带有@NotNull 字段的类。构造函数自然不接受null,而是抛出异常。当然这个构造函数的参数也是用@NotNull注解的。

为什么 IntelliJ IDEA 抱怨空检查?文档指出:

带有 NotNull 注释的元素声明 null 值被禁止返回(对于方法)、传递给(参数)并保持(局部变量和字段)。

但是我仍然需要在运行时检查空值,以防构建系统不理解注释并接受像new Car(null) 这样的语句。我错了吗?

【问题讨论】:

  • 如果注解不存在,构建会失败,不是吗?无论如何,IDE 没有任何线索表明您实际上并不关心注释。如果您不希望它抱怨空检查,请禁用检查。
  • 嗯,这对我来说可能是不好的措辞。我通过 gradle 拉出注释库。我的意思是如果构建系统不关心注释会怎样。

标签: java intellij-idea annotations notnull


【解决方案1】:

如果您使用 JetBrains @NotNull 注释,运行时断言将被添加到您编译的字节码中,这将保证 null 不会在那里传递。那么在源代码中编写相同的检查真的没有意义。这种方法对我们来说效果很好。

如果您使用其他注释或者只是不想检测字节码,您可以通过在其上按 Alt+Enter、“编辑检查设置”并选中“忽略断言语句”来禁用此特定警告。 IDE 将此类条件语句视为断言。

【讨论】:

    【解决方案2】:

    如果构造函数的参数是Not Null,那么用and if语句检查null值是没有意义的。

    而且我们知道参数 Engine 所持有的任何值都不为 null,因此此检查将始终为 false。

    因此,您的屏幕截图中显示的检查将完全有意义。如果您真的不想看到 null 检查检查,请从首选项部分禁用它。

    简而言之,您正在检查的值在构造函数中不为空,IDE 知道这一点。

    【讨论】:

    • 好吧,我虽然注释用于检查调用代码是否传递空值。忽略空值检查并依赖特定的 IDE 来避免空值只是感觉不对。
    • 我只是不明白你的意思。如果您已将其注释为非空,那么您为什么要检查空?在构造函数中它总是不为 null 不是吗?
    • 这个 NotNull 注释来自 Java 1.6,对于任何 IDE 都是一样的。所以你不必担心
    • 不鼓励使用依赖于 IDE 的注解。签出这个答案stackoverflow.com/a/4963586/2557818有一个内置的java注释约束可用。
    • 有道理,谢谢!我将阅读有关此主题的更多信息并尝试正确迁移注释。
    【解决方案3】:

    他们希望你使用

            Objects.requireNonNull(engine, "engine");
    

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 2020-11-30
      • 2013-08-14
      • 1970-01-01
      • 2015-07-02
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多