有什么办法可以抑制这个警告:
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/