有什么办法可以抑制此警告:
MyClass object = null;
/*Some code that 'might' set this object but I know it will*/
Preconditions.checkNotNull(object);
//when "assert object != null" is used here no warning is shown
merged.setName(dRElement.getName());
//"May produce 'java.lang.NullPointerException'" warning here
我使用的是IntelliJ IDEA 10.5,我知道此警告是不必要的,但是我想在此处进行抑制,避免关闭检查。
最佳答案
通过结合@Contract
注释和“外部注释”功能,您现在可以对Preconditions
方法进行注释,以便IntelliJ对这些方法的调用应用正确的静态分析。
假设我们有这个例子
public void doSomething(Object someArg) {
Preconditions.checkArgument(someArg != null);
someArg.doSomethingElse(); //currently gives NPE warning
if (someArg != null) {
//no warning that this is always true
}
}
在IntelliJ中(我正在使用13):
Preconditions.checkArgument(boolean)
。 false -> fail
。 现在
someArg.doSomethingElse()
的警告消失了,IDEA实际上将if
分支标记为始终为真!其他契约(Contract)文本:
Preconditions.checkArgument(boolean, String)
应该是false, _ -> fail
Preconditions.checkNotNull(Object, String)
应该是null, _ -> fail
,这是我的
annotations.xml
的完整Preconditions
文件:<root>
<item name='com.google.common.base.Preconditions T checkNotNull(T)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions T checkNotNull(T, java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions T checkNotNull(T, java.lang.String, java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null, _, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean, java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean, java.lang.String, java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean, java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean, java.lang.String, java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _, _ -> fail""/>
</annotation>
</item>
</root>
也可以看看
关于intellij-idea - 谷歌 Guava checkNotNull和IntelliJ IDEA的 “may produce java.lang.NullPointerException”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6598228/