【问题标题】:Best way to allow NullPointerException when null analysis is turned on打开 null 分析时允许 NullPointerException 的最佳方法
【发布时间】:2014-06-05 00:52:39
【问题描述】:

在 Eclipse 的 Java JDT 插件中,有一个选项可以针对空指针问题打开错误和警告。您可以注释代码以指示字段、变量、参数或返回值是否可以为空。

问题是这样的。如果启用此功能并启用空指针访问错误并将字段标记为可能为空

   private @Nullable SomeClass _delegate;

但您实际上希望对该字段的特定访问以在 null 时生成 NullPointerException:

   /**
    * @throws NullPointerException if delegate is null
    */
   void someMethod()
   {
       _delegate.someMethod();
   }

正如所写,我不能这样做,因为 JDT 给了我一个“潜在的空指针”错误。 JDT 没有提供任何抑制错误的方法(据我所知)。

我可以将此错误的严重性降低为警告,然后取消它,或者我可以显式检查 null 并手动抛出 NullPointerException。有没有其他好办法解决这个问题?

【问题讨论】:

    标签: java eclipse nullpointerexception eclipse-jdt


    【解决方案1】:

    一种可能的解决方案是使用 Java 7 中引入的 Objects.requireNonNull 方法。这将执行显式的 null 检查,因此我可以编写:

    Objects.requireNonNull(_delegate).someMethod();
    

    我不确定 JVM 是否足够聪明,可以在运行时优化这个调用。因此,对于性能关键代码,您可能需要在使用此技术时进行分析。

    【讨论】:

      【解决方案2】:

      就个人而言,我发现 NPE 是最没有帮助的异常之一,通常希望它至少能给出正在访问的变量的名称并且为空。话虽如此,考虑到我对它们的普遍厌恶,我可能会在您的场景中将 NullPointerException 替换为 IllegalStateException。

      除此之外,我认为按照您自己已经说过的将严重性降低到警告是最合乎逻辑的方式。这可能是我个人的偏好,但对我来说,编译错误是编译器告诉我“你所做的绝对行不通”——这就是为什么当它找到一个时它会罢工。然而,对于空访问,编译器通常不能确定,除非在某些解释的情况下——它甚至说这是一个潜在的空访问。因此,无论如何,将其作为警告而不是错误更有意义。

      今天早上不是我最雄辩的,所以 tl;dr: Errors="fatal", warnings="you'll live (barely)",潜在的空访问不是致命的,所以把它放到警告中。

      【讨论】:

      • 我不确定 IllegalStateException 是否会比 NPE 提供更多信息,如果我必须手动抛出,我可以创建更有用的错误消息。选择 NPE 有几个原因:(1)您可能会覆盖明确记录的方法以在适用条件下抛出 NPE(2)JVM 将为您生成一个,因此您不必膨胀带有额外 throw 调用的代码。
      • 我同意将其设置为警告而不是错误并不是那么糟糕,因为我们的做法通常是避免使用其中任何一个签入代码,但将其标记为错误会更好。不幸的是,JDT 没有提供一种方法来抑制仅存在于 JDT 中的错误,例如这个。
      • 当然,在自我抛出的消息中更具描述性是正确的。我认为我表达得很糟糕,我的意思是如果我自己抛出异常,NPE 永远不是我会选择的(当然,除非,正如你所说,受现有 API 的约束,我是压倒一切)。解决您的问题的另一种(丑陋)方法是在您想要签入时禁用空访问选项。我想如果您使用细粒度提交,这将变得相当乏味。
      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2016-09-13
      • 2011-02-18
      • 2014-09-02
      • 1970-01-01
      相关资源
      最近更新 更多