我一直在使用@Nonnull和@Nullable注释方法给其他程序员(和我自己!)一个方法可以返回的线索.我终于决定在一个类上实际运行Findbugs(IntelliJ - FindBugs-IDEA v1.0.1),我不明白我所看到的行为.文档也没有帮助.
假设我有以下示例代码:
import javax.annotation.Nonnull;
public class Main {
public static void main(String[] args) {
}
@Nonnull
public static String myFunc(){
return new String("foo");
}
@Nonnull
public static String myFunc2(){
return "foo";
}
}
Run Code Online (Sandbox Code Playgroud)
Findbugs将myFunc()的return语句标记为"已知为非空值的冗余nullcheck",但对myFunc2()感到满意.
是否期望findbugs看到这些不同?(赞赏文档链接)我是否完全误解了@Nonnull对方法的使用?
[编辑]
经过一些研究,我已经确定org.jetbrains @Contract注释(合同违规更改为错误)将更好地满足我的需求.谢谢Guillaume F.的帮助!
您必须了解冗余空检查的含义。当 Findbugs 向您发出此警告时,这意味着您进行了两次 Null-Check,并且第二次是不必要的。这符合你的例子。
在第一个代码中,new String("foo")执行隐式空检查,因为new String(null)会抛出异常。所以这个新的 String 对象被隐式地检查为非空。@Nonnull然后在离开该方法时进行另一次检查。Findbugs 看到这一点并向您发出警告。
在你的第二个代码中,没有这样的控制,因为你返回一个原始字符串并且@Nonnull只进行一次检查。一切安好。
也许您会想使用edu.umd.cs.findbugs.annotations.NonNull它。这只是暗示 Findbugs 您想要一个非空结果,而无需进行真正的检查。
如果您使用 Maven:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>annotations</artifactId>
<version>${findbugs-annotations.version}</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type