有什么办法可以抑制此警告:

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)
  • 将光标放在方法名称上,然后按Alt-Enter弹出意图提示。
  • 选择“添加方法契约(Contract)”。
  • 使用契约(Contract)文本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="&quot;null -&gt; fail&quot;"/>
            </annotation>
        </item>
        <item name='com.google.common.base.Preconditions T checkNotNull(T, java.lang.Object)'>
            <annotation name='org.jetbrains.annotations.Contract'>
                <val val="&quot;null, _ -&gt; fail&quot;"/>
            </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="&quot;null, _, _ -&gt; fail&quot;"/>
            </annotation>
        </item>
        <item name='com.google.common.base.Preconditions void checkArgument(boolean)'>
            <annotation name='org.jetbrains.annotations.Contract'>
                <val val="&quot;false -&gt; fail&quot;"/>
            </annotation>
        </item>
        <item name='com.google.common.base.Preconditions void checkArgument(boolean, java.lang.Object)'>
            <annotation name='org.jetbrains.annotations.Contract'>
                <val val="&quot;false, _ -&gt; fail&quot;"/>
            </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="&quot;false, _, _ -&gt; fail&quot;"/>
            </annotation>
        </item>
        <item name='com.google.common.base.Preconditions void checkState(boolean)'>
            <annotation name='org.jetbrains.annotations.Contract'>
                <val val="&quot;false -&gt; fail&quot;"/>
            </annotation>
        </item>
        <item name='com.google.common.base.Preconditions void checkState(boolean, java.lang.Object)'>
            <annotation name='org.jetbrains.annotations.Contract'>
                <val val="&quot;false, _ -&gt; fail&quot;"/>
            </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="&quot;false, _, _ -&gt; fail&quot;"/>
            </annotation>
        </item>
    </root>
    

    也可以看看
  • IDEA-113391: Edit Method Contract intention for library methods
  • IDEA-93372: Implement something similar to ReSharper contract annotations for Java
  • IDEA-60343: False positive NPE warning when using guava Preconditions - Constant conditions & Expectations
  • 关于intellij-idea - 谷歌 Guava checkNotNull和IntelliJ IDEA的 “may produce java.lang.NullPointerException”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6598228/

    10-16 22:44