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)
。 - 将光标置于方法名称上,然后按Alt – Enter键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=""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>
也可以看看
- 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自动完成它,查看字节和源代码。
除了其他的select,你可以尝试 –
在方法级别禁止警告使用 –
@SuppressWarnings({"NullableProblems"}) public void someMethod(){ ... ... }
或通过使用注释来压制语句级别的警告 –
//noinspection NullableProblems someMethodCallProducingNullWarning(null);
但在这之前 – 确保它不会真的产生NPE