打开空分析时允许NullPointerException的最佳方法

时间:2014-06-05 00:52:40

标签: java eclipse nullpointerexception eclipse-jdt

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

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

   private @Nullable SomeClass _delegate;

但实际上你想要特殊访问这个字段来生成一个NullPointerException如果为null:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

Objects.requireNonNull(_delegate).someMethod();

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

答案 1 :(得分:0)

就个人而言,我发现NPE是最不有帮助的例外之一,通常希望它至少会给出被访问的变量的名称并且为空。话虽如此,鉴于我对它们的普遍厌恶,我可能会在你的场景中用一个IllegalStateException替换NullPointerException。

除此之外,我认为将严重性降低到警告,因为你已经说过自己是最合乎逻辑的方式。这可能是我个人的偏好,但对我来说编译错误是编译器告诉我"你做了什么绝对不会工作" - 这就是它找到一个罢工的原因。但是,对于空访问,编译器通常无法确定,除非在某些解释的情况下 - 它甚至表示它是潜在的 null访问。因此,将此作为警告而不是错误更有意义。

今天早上不是最有说服力的,所以tl;博士:错误="致命",警告="你活着(勉强)",潜在的空访问权限是&n #39; t致命,所以把它放到警告。