Google-guava checkNotNull和IntelliJ IDEA的“可能会产生java.lang.NullPointerException”

有什么办法来压制这个警告:

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,我知道这个警告是不必要的,但我想在这里压制,并避免closures检查。

通过@Contract注释和外部注释function的组合,您现在可以注释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)
  • 将光标置于方法名称上,然后按AltEnter键popup意图popup窗口。
  • select“添加方法合同”。
  • 使用合约文本false -> fail
  • 出现提示时,提供外部注释文件的位置。

现在,在someArg.doSomethingElse()的警告消失了,IDEA实际上会将if分支标记为true!

其他合同文本:

  • 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:编辑方法库方法的合同意图
  • IDEA-93372:实现类似于Java的ReSharper合同注释
  • IDEA-60343:使用番石榴时误报NPE警告前提条件 – 恒定条件和期望值

JetBrains Yourtrack中存在一个老问题来添加这种types的function。 我几年前投了票,但我没有看到一个活动。 如果每个人都为此投票,那么我们可能会很幸运。

澄清问题包括添加function,以便您可以标记方法执行某种types的空检查。 如果发生了这种情况,那么你可以为Preconditions方法编写自己的包装器并对其进行注释。

更新我厌倦了等待function,所以我自己提交了一个补丁。 它在12.1.1 build 129.239中可用。 要访问configuration:设置>检查>可能的错误>常量条件和例外>configuration断言/检查方法。

提取一个方法?

 private MyClass getMyClass() { /* This always returns an instance of MyClass, never null. */ } ... MyClass object = getMyClass(); Preconditions.checkNotNull(object); merged.setName(object.getName()); 

您还可以从checkNotNull方法(非空值)分配返回的值: http : //docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/Preconditions.html# checkNotNull(T)

 MyClass object = null; object = Preconditions.checkNotNull(object); merged.setName(dRElement.getName()); 

从IntelliJ IDEA 14,你不必担心这一点。

 @Nullable String extractPrefix(@Nullable String url) { if (StringUtils.isEmpty(url)) return null; if (url.startsWith("jar://")) { ... 

早期的IntelliJ IDEA没有线索,如果url为null,那么代码执行甚至不会到达“startsWith”调用,因为它没有看到StringUtils.isEmpty。 你当然可以去掉extractPrefix中的黄色警告,看看里面的isEmpty,然后添加一个“null – > true”的合约,但那太无聊了! 这对于计算机来说完全是一个工作,而不是你,现在IntelliJ IDEA自动完成它,查看字节和源代码。

http://blog.jetbrains.com/idea/2014/10/automatic-notnullnullablecontract-inference-in-intellij-idea-14/

除了其他的select,你可以尝试 –

在方法级别禁止警告使用 –

 @SuppressWarnings({"NullableProblems"}) public void someMethod(){ ... ... } 

或通过使用注释来压制语句级别的警告 –

 //noinspection NullableProblems someMethodCallProducingNullWarning(null); 

但在这之前 – 确保它不会真的产生NPE