簡體   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