我一直在使用方法的@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";
}
}
Findbugs将myFunc()的return语句标记为“已知为非空值的冗余nullcheck”,但对myFunc2()感到满意。
预计findbugs会看到不同的这些吗? (赞赏文档链接)我是否完全误解@Nonnull在方法上的使用?
[编辑]
经过一些研究,我认为org.jetbrains @Contract注释(合同违规更改为错误)将更好地满足我的需求。感谢Guillaume F.的帮助!
答案 0 :(得分:2)
您必须了解冗余Null-Check的含义。当Findbugs给你这个警告时,它意味着你做了两次Null-Check,第二次没有必要。哪个符合你的例子。
在第一个代码中,new String("foo")
执行隐式空检查,因为new String(null)
将抛出异常。因此,这个新的String对象被隐式地检查为非null。然后在离开方法时再进行@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>
https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type