我经常遇到以下 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 会提出有意义的建议,这是一个常见的建议,所以我在这里错过了重点吗?
最佳答案
使用 Objects#requireNonNull
背后的原因类似于返回 Optional
后面的那个: 你这样做是为了管理期望。
Optional<Something>
而不仅仅是 Something
你在说:“嘿,我知道这个 Something
值可能会丢失,所以我没有返回 null
并让你猜,而是返回一个 Optional<Something>
来明确你应该期望它也许不在那里,我希望你在使用它之前检查它是否在那里。” Objects.requireNonNull(something)
在您的代码中使用 something
,您是在说:“嘿,如果您正在阅读本文,我只是想让您知道,我希望 的 something
参数不为 为空,并且我希望您确保它不是在调用此代码之前;因此,我不只是信任您并直接调用 something.contains(...)
,而是在此时此地调用 requireNonNull
以说明清楚(以防我们中的任何人错过了 @NotNull
中的注释方法声明)。” 它解决了问题吗?不,它没有。 IntelliJ 不能神奇地禁止参数为空。但它可以迫使任何阅读该代码的人意识到该参数不应该为空,并推断可能发生这种情况的场景。
关于java - IntelliJ 检查 : 'Method invocation may produce NullPointerException' . 建议的修复是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55273346/