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

yquaqz18  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(186)

简短版本

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

长版本

NetBeans是一个众所周知的错误1234,它会错误地告诉您不需要对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提示,而不是执行阶段保证。

  • 仅仅因为方法的参数标记为@NotNullable
  • 并不意味着它不能是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 deference 警告-我肯定要保留
1.我试着按Alt+Enter来显示更多选项:

但没有任何有价值的出现:
1.我尝试让它将我带到配置Null dereferncing提示的区域:

但它肯定与不必要的null测试无关。
1.我尝试搜索名为 “null” 的提示或警告:
x1c4d 1x指令集
但它不在那里。
1.我尝试搜索名为 “不必要” 的提示或警告:

但它不在那里。
1.我尝试搜索名为 “test” 的提示或警告:


指令集
但它不在那里。
如何关闭它
这就引出了我的问题:

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

额外阅读

cl25kdpy

cl25kdpy1#

您可以使用Java注解@SuppressWarnings("null")关闭“Unnecessary test for null”警告。该注解位于java.lang中,不需要导入。
The OpenJDK Javadoc for SuppressWarnings for JDK 17 states
指示应在带注解的元素(以及带注解的元素中包含的所有程序元素)中禁止显示命名编译器警告...出于风格考虑,程序员应始终在嵌套最深的元素上使用此注解,因为它是有效的。如果要禁止显示特定方法中的警告,则应注解该方法,而不是其类。
从Java语言规范的www.example.com部分的链接文档中9.6.4.5可以看出,@SuppressWarnings似乎完全满足了您的需要,我在这里强调了一下:
9.6.4.5. @抑制警告
Java编译器越来越能够发出有用的“类似棉绒的”警告。为了鼓励使用这样的警告,当程序员知道警告不合适时,应该有某种方法来禁用程序中某个部分的警告
下面是基于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行显示了不必要的警告“* 不必要的空值测试 *”。
  • 第27行上的注解@SuppressWarnings("null")防止在其他方面相同的方法doSomething2()中第30行上显示不必要的警告“Unnecessary test for null”。

aelbi1ox

aelbi1ox2#

答案是:这是做不到的。
NetBeans没有提供禁用不必要的空值测试警告的方法。

解决方法

正如其他人在其他回答中所指出的:

  • 可以为空
  • NetBeans错误地认为它不能为空

解决(不正确的)警告的正确方法是 * 混淆 * 空值检查。
而不是叫:

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

而是呼叫:

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

这是一回事;只是这样NetBeans就不会意识到您正在测试null的变量,因此也不会发出警告。

相关问题