簡體   English   中英

如何讓IntelliJ IDEA了解我的空檢查方法?

[英]How can I make IntelliJ IDEA understand my null-checking method?

我有一個方法,其中參數用@Nonnull注釋標記。 調用該方法的代碼必須檢查該值是否為null。 它不是直接的x != null檢查,而是在另一個類上調用實用程序方法。 (在實際代碼中,實用程序方法還檢查它是否為空字符串)。

我的問題是Intellij Idea在Nonnull方法調用上顯示檢查警告,說我的變量“可能為null”。 我知道它不能為空因為實用方法檢查 - 我怎么能告訴檢查員呢?

由於這有點抽象,這里是我的意思的最小例子:

package org.ethelred.ideatest;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

/**
 * tests annotations
 */
public class AnnotationChecker
{
    public static void main(String[] args)
    {
        String x = null;
        if(args.length > 0)
        {
            x = args[0];
        }

        if(!isNull(x))
        {
            useObject(x);
        }

        if(x != null)
        {
            useObject(x);
        }
    }

    public static boolean isNull(@CheckForNull Object o)
    {
        return o == null;
    }


    public static void useObject(@Nonnull Object o)
    {
        System.out.println(o);
    }
}

這使用JSR 305注釋。

在這個例子中,在第一次調用useObject Intellij對x參數發出警告,說“Argument'x'可能為null”。 第二次通話中,沒有警告。

在IDEA 13中添加了一個非常奇特的功能,稱為方法合同 例如,您可以使用一個方法,如果遇到null則拋出驗證異常:

@Contract("null -> fail")
public static void validateNull(@Nullable final Object object) {
    if (object == null) {
        throw new ValidationException();
    }
}

如果您在可能的NPE之前調用注釋,IDEA將分析注釋並且不會顯示警告:

validateNull(user);
user.setSomething("something"); // no warning

您有IDEA設置的完整文檔(只需搜索方法合同)。 為此,您需要額外依賴jetb​​rain的注釋jar:

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>13.0</version>
</dependency>

隨着IDEA 12可以配置NOTNULL檢查方法: http://youtrack.jetbrains.com/issue/IDEA-35808#tab=Comments

我不相信有任何方法可以用編寫的代碼來解決警告。 我希望發現IntelliJ支持@SuppressWarnings的值,你可以在useObject(x)語句中使用它,但根據這個來源,它沒有。 您可能只需要咬緊牙關並將代碼更改為以下內容:

if (x != null && !isBlank(x)) {
    useObject(x);
}

請注意,我將方法isNull重命名為isBlank因為我理解您調用的實際方法檢查null檢查其他條件。

我通過使用靜態方法將對象調用列入白名單來解決此問題:

/** Wrapper to mask NullPointerException warnings. */
private static <T> T _(T obj) {

    return obj;
}

方法名稱旨在不干擾可讀性。 從而,

mObject.method();

_(mObject).method();

此外,如果確實發生NullPointerException,它仍將引用相同的行號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM