java - IntelliJ 检查 : 'Method invocation may produce NullPointerException' . 建议的修复是否有意义?

标签 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 会提出有意义的建议,这是一个常见的建议,所以我在这里错过了重点吗?

最佳答案

使用 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/

    相关文章:

    java - Microsoft Windows Server 2003 中的 JRE 问题

    java - Spring PropertyPlaceholderConfigurer 不注入(inject)值

    java - 如何在 IntelliJ 中使用我的 Maven 用户 settings.xml?

    java - Maven 没有将所有依赖项添加到 jar

    python - IntelliJ + Python 插件 : Python remote interpreter gets created without classpath, 不工作

    java - 什么是NullPointerException,我该如何解决?

    java - BinarySearchTree - isBalanced() 方法获取 NullPointerException - Java

    Java netty AbstractChannelHandlerContext invokeExceptionCaught

    java - Controller 内部未接收到参数

    java - 如何从 firebase 实时数据库检索用户名