繁体   English   中英

如何在 NetBeans 14 中禁用“不必要的 null 测试”警告?

[英]How to disable "unnecessary test for null" warning in NetBeans 14?

精简版

如何禁用 NetBeans 14 IDE 中的“不必要的 null 测试”警告?

在此处输入图像描述

长版

NetBeans 作为一个众所周知的错误1 ​​2 3 4它会错误地告诉您对null的测试是不必要的。 例如在以下代码中:

import javax.validation.constraints.NotNull;

private void doSomething(@NotNull Object o) {
   
   if (o == null) return;

   //...do more stuff...
}

IDE认为

  • 因为o参数被标记为@NotNull o
  • o一定不可能null
  • 所以一定是if语句是不必要的

这显然是错误的

@NotNull注释只是一个 IDE 提示,不是运行时保证。

  • 仅仅因为方法的参数被标记为@NotNull可以
  • 不代表不能是null

您可以通过将null传递给doSomething方法来证明这一点。 (我们甚至可以编写测试代码,这样 IDE 就不会产生任何提示或警告:)

Object o = getTestValue();
doSomething(o);

private Object getTestValue()
{
    Object o = null;
    return o;
}

private void doSomething(@NotNull Object o) {
    Objects.requireNonNull(value);
    //...do more stuff...
}

并观察doSomething方法失败 - 因为onull - 即使它被标记为@NotNull

现在,可能有@NotNull的其他实现,或者添加运行时检查的其他编译器。 我不是在谈论那些。 NetBeans IDE 14 警告是错误的,所以我需要禁用它。

研究工作

  1. 我尝试单击灯泡,希望能配置警告:

在此处输入图像描述

但它只提供配置null 尊重警告 -我绝对想保留

  1. 我尝试按Alt + Enter以显示更多选项:

在此处输入图像描述

但没有任何有价值的东西出现:

  1. 我试图让它带我到该区域配置Null 取消引用提示:

在此处输入图像描述

但这绝对与*对 null 的不必要测试无关

  1. 我尝试搜索名为"null"的提示或警告:

在此处输入图像描述

但它不存在。

  1. 我尝试搜索名为“不必要”的提示或警告:

在此处输入图像描述

但它不存在。

  1. 我尝试搜索名为“test”的提示或警告:

在此处输入图像描述

但它不存在。

如何关闭它

这让我想到了我的问题:

  • 鉴于 NetBeans IDE 14 无法关闭“不必要的空值测试”警告
  • 如何关闭 NetBeans IDE 14 中的“不必要的 null 测试”警告?

奖金阅读

您可以使用 Java 注释@SuppressWarnings("null")关闭“ Unnecessary test for null ”警告。 该注释位于java.lang中,不需要导入。

OpenJDK Javadoc for SuppressWarnings for JDK 17 状态

指示应在带注释的元素(以及带注释的元素中包含的所有程序元素)中抑制命名的编译器警告...作为一种风格,程序员应始终在有效的嵌套最深的元素上使用此注释. 如果您想在特定方法中抑制警告,您应该注释该方法而不是它的类。

链接文档到 Java Language Specification 的第 9.6.4.5 节@SuppressWarnings似乎完全符合您的要求,我的重点是:

9.6.4.5。 @SuppressWarnings

Java 编译器越来越有能力发出有用的“类似 lint”的警告。 为了鼓励使用此类警告,当程序员知道警告不合适时,应该有一些方法可以在程序的一部分中禁用警告

这是基于 OP 中的示例代码:

package suppression;
import javax.validation.constraints.NotNull; // Jakarta EE 8
//import jakarta.validation.constraints.NotNull; // Jakarta EE 9

public class Suppression {

    public static void main(String[] args) {

        Suppression supp = new Suppression();
        Object o = supp.getTestValue();
        supp.doSomething(o);
        supp.doSomething2(o);
    }

    Object getTestValue() {
        Object o = null;
        return o;
    }

    private void doSomething(@NotNull Object o) {
        
        if (o == null) {
            System.out.println("Object is null!");
        }
    }

    @SuppressWarnings("null")
    private void doSomething2(@NotNull Object o) {
        
        if (o == null) {
            System.out.println("Object is null!");
        }
    }
}

这是 NetBeans 14 中该代码的屏幕截图,其中显示:

  • 方法doSomething()中的第 22 行显示了不需要的警告“对 null 的不必要测试”。
  • 第 27 行的注释@SuppressWarnings("null")可防止在第 30 行以其他相同的方法doSomething2()显示不需要的警告“ Unnecessary test for null ”。

抑制警告

答案是:做不到。

NetBeans 无法禁用对 null 警告的不必要测试

解决方法

正如其他答案中的其他人所指出的那样:

  • 该值可以是 null
  • NetBeans 错误地认为它不可能是 null

解决(不正确)警告的正确方法是混淆对 null 的检查。

而不是调用:

if (customer == null) { ... }

而是调用:

if (Object.isNull(customer)) { ... }

这是同一件事; 除了这种方式 NetBeans 没有意识到您正在测试null的变量,因此不会警告您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM