[英]How to tell IntelliJ IDEA that a method is checking for null value (ConstantConditions warning)
[英]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設置的完整文檔(只需搜索方法合同)。 為此,您需要額外依賴jetbrain的注釋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.