在Eclipse的Java JDT插件中,有一个选项可以为空指针问题打开错误和警告。您可以注释代码以指示字段,变量,参数或返回值是否为null。
问题是这个。如果启用此功能并为空指针访问启用错误并将字段标记为可能为空
private @Nullable SomeClass _delegate;
但实际上你想要特殊访问这个字段来生成一个NullPointerException如果为null:
/**
* @throws NullPointerException if delegate is null
*/
void someMethod()
{
_delegate.someMethod();
}
正如所写,我不能这样做因为JDT给了我一个“潜在的空指针”错误。 JDT没有提供任何方法来抑制错误(据我所知)。
我可以将此错误的严重性降低为警告,然后将其抑制,或者我可以显式检查null并手动抛出NullPointerException。还有其他好方法可以解决这个问题吗?
答案 0 :(得分:1)
一种可能的解决方案是使用Java 7中引入的Objects.requireNonNull方法。这将执行显式空检查,因此我可以写:
Objects.requireNonNull(_delegate).someMethod();
我不确定JVM是否足够智能以在运行时优化此调用。因此,对于性能关键代码,您可能希望在使用此技术时进行分析。
答案 1 :(得分:0)
就个人而言,我发现NPE是最不有帮助的例外之一,通常希望它至少会给出被访问的变量的名称并且为空。话虽如此,鉴于我对它们的普遍厌恶,我可能会在你的场景中用一个IllegalStateException替换NullPointerException。
除此之外,我认为将严重性降低到警告,因为你已经说过自己是最合乎逻辑的方式。这可能是我个人的偏好,但对我来说编译错误是编译器告诉我"你做了什么绝对不会工作" - 这就是它找到一个罢工的原因。但是,对于空访问,编译器通常无法确定,除非在某些解释的情况下 - 它甚至表示它是潜在的 null访问。因此,将此作为警告而不是错误更有意义。
今天早上不是最有说服力的,所以tl;博士:错误="致命",警告="你活着(勉强)",潜在的空访问权限是&n #39; t致命,所以把它放到警告。