我有一个方法,其中参数标记为@Nonnull
注解。调用该方法的代码必须检查该值是否为空。而不仅仅是直x != null
检查,它正在调用另一个类上的实用方法。 (在实际代码中,实用程序方法还会检查它是否为空字符串)。
我的问题是 Intellij Idea 在 Nonnull 方法调用上显示检查警告,说我的变量“可能为 null”。我知道它不能为空,因为实用程序方法检查 - 我如何告诉检查员这一点?
由于这有点抽象,下面是我的意思的一个最小示例:
package org.ethelred.ideatest;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
/**
* tests annotations
*/
public class AnnotationChecker
{
public static void main(String[] args)
{
String x = null;
if(args.length > 0)
{
x = args[0];
}
if(!isNull(x))
{
useObject(x);
}
if(x != null)
{
useObject(x);
}
}
public static boolean isNull(@CheckForNull Object o)
{
return o == null;
}
public static void useObject(@Nonnull Object o)
{
System.out.println(o);
}
}
这使用了 JSR 305 注释。
在这个例子中,在first拨电至useObject
Intellij 发出警告x
参数说“参数‘x’可能为空”。在里面second打电话,没有任何警告。
在 IDEA 13 中添加了非常奇特的功能,称为方法合同。例如,您可以有一个方法,如果遇到 null,则抛出验证异常:
@Contract("null -> fail")
public static void validateNull(@Nullable final Object object) {
if (object == null) {
throw new ValidationException();
}
}
如果您在可能的 NPE 之前调用 IDEA,IDEA 将分析注释并且不会显示警告:
validateNull(user);
user.setSomething("something"); // no warning
您在 IDEA 的设置中拥有完整的文档(只需搜索 Method Contract)。为此,您需要额外依赖 jetbrain 的注释 jar:
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>13.0</version>
</dependency>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)