IntelliJ检查:“方法调用可能会产生NullPointerException”。建议的解决方案有意义吗?

时间:2019-03-21 03:27:55

标签: java intellij-idea nullpointerexception intellij-inspections

我通常遇到以下IntelliJ检查

private boolean bar() {    
    return foo().contains("foo"); // Method invocation 'contains' may produce 'java.lang.NullPointerException'
}

private String foo() {
    return null;
}

对我而言,检查似乎很好,但是IntelliJ建议的一种(或通常是唯一的)修复是:

private boolean bar() {
    return Objects.requireNonNull(foo()).contains("foo");
}

警告消失了。但是我完全不知道这有什么帮助? requireNonNull只会抛出与在NullPointerException上调用.contains时所抛出的相同的null

通常,IntelliJ提出有意义的建议,这是一个常见的建议,所以我在这里遗漏了吗?

1 个答案:

答案 0 :(得分:2)

使用Objects#requireNonNull的原因类似于返回Optional的原因:您这样做是为了管理期望。

  • 当您返回Optional<Something>而不是Something时,您是在说:“嘿,我知道此Something值可能会丢失,因此与其返回{{1 }},让您猜测一下,我返回的是null,以明确表示您应该期望它可能不存在,并且希望您在使用前检查它是否存在。”
  • 当您在使用Optional<Something>之前在代码中调用Objects.requireNonNull(something)时,您说的是:“嘿,如果您正在阅读此书,我只是想让您知道我希望这样做将something参数设置为为空,并且我希望您在调用此代码之前先确保它不是;因此,与其仅信任您并直接调用something,我现在就在这里调用something.contains(...)来使其清晰(以防万一我们中的任何人在方法声明中错过了requireNonNull注释)。”

它可以解决问题吗?不,不是。 IntelliJ无法神奇地禁止参数为空。但这会迫使任何阅读该代码的人都知道该参数不应为null,并可能导致这种情况发生。