【发布时间】:2020-03-03 00:13:38
【问题描述】:
我有一个带有hasField 函数的类,用于检查字段是否存在且不为空,还有一个getField 函数返回字段的值(如果不存在,则为空)。
在我的代码中,当我在检查 hasField 后立即调用 getField 时,我知道 getField 不会返回 null,但 IDE 检查(常量条件和异常)不会我知道。我得到一堆方法method name 可能会产生一个NullPointerException
我正在尝试找到一种干净的方法来消除此警告。
解决方法
这里有一些我可以做的变通办法,但我发现所有这些都很奇怪:
- 用
Objects.requireNotnull包围getField,代码将是无操作的。不希望这样做,因为它会使代码的可读性稍差。 - 在我知道这是安全的情况下禁止显示警告。同样不是首选,因为这将发生在我们代码中的很多地方。
- 忽略警告。在这种情况下,我们可能会因为警告部分过于嘈杂而错过合法警告。
理想的解决方案
我能否以某种方式设置警告,如果hasField 为真,那么getField 将返回非空值?我查看了JetBrains Contract Annotations,但在这里做我想做的似乎超出了@Contract 所支持的范围
代码示例
以下是演示该问题的最低工作代码示例:
import javax.annotation.Nullable;
public class Hello {
private Hello(){}
public static void main(String[] args) {
TestClass test1 = new TestClass(null);
if (test1.hasSample()) {
System.out.println(test1.getSample().equals("abc"));
}
}
}
class TestClass {
private final String sample;
TestClass(String field) { this.sample = field; }
boolean hasSample() { return sample != null; }
@Nullable public String getSample() { return sample; }
}
我收到以下警告
方法调用
equals可能产生NullPointerException
理想情况下,我希望能够在 hasSample 为 true 时告诉 IDE getSample 不为空。
【问题讨论】:
标签: java intellij-idea annotations code-inspection