我通常遇到以下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提出有意义的建议,这是一个常见的建议,所以我在这里遗漏了吗?
答案 0 :(得分:2)
使用Objects#requireNonNull
的原因类似于返回Optional
的原因:您这样做是为了管理期望。
Optional<Something>
而不是Something
时,您是在说:“嘿,我知道此Something
值可能会丢失,因此与其返回{{1 }},让您猜测一下,我返回的是null
,以明确表示您应该期望它可能不存在,并且希望您在使用前检查它是否存在。” Optional<Something>
之前在代码中调用Objects.requireNonNull(something)
时,您说的是:“嘿,如果您正在阅读此书,我只是想让您知道我希望这样做将something
参数设置为不为空,并且我希望您在调用此代码之前先确保它不是;因此,与其仅信任您并直接调用something
,我现在就在这里调用something.contains(...)
来使其清晰(以防万一我们中的任何人在方法声明中错过了requireNonNull
注释)。” 它可以解决问题吗?不,不是。 IntelliJ无法神奇地禁止参数为空。但这会迫使任何阅读该代码的人都知道该参数不应为null,并可能导致这种情况发生。