6

我经常遇到以下 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只会抛出与on 调用NullPointerException时无论如何都会抛出的相同的东西。.containsnull

通常,IntelliJ 会提出有意义的建议,这是一个常见的建议,所以我在这里错过了重点吗?

4

1 回答 1

6

using 背后的原因Objects#requireNonNull类似于return 背后的原因Optional:你这样做是为了管理期望。

  • 当你返回Optional<Something>而不是仅仅Something在说:“嘿,我知道这个Something值可能会丢失,所以null我不是返回让你猜,而是返回一个Optional<Something>来表明你应该期望它可能不是在那里,我希望你在使用它之前检查它是否在那里。”
  • 当你Objects.requireNonNull(something)在使用之前调用你的代码时something,你是在说:“嘿,如果你正在阅读这篇文章,我只是想让你知道我希望这个something参数为空,并且我希望你确保它是't 在调用此代码之前;因此something.contains(...),我不只是信任您并直接调用,而是在此时requireNonNull此地调用以使其清楚(以防我们中的任何人错过了@NotNull方法声明中的注释)。”

它解决了问题吗?不,它没有。IntelliJ 不能神奇地禁止参数为空。但它可以迫使任何阅读该代码的人意识到该参数不应该为空,并推断可能发生这种情况的场景。

于 2019-03-21T14:36:38.657 回答