我一直在方法上使用@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() 的返回语句标记为具有“已知为非空值的冗余空值检查”,但对 myFunc2() 感到满意。
是否期望 findbugs 对这些有不同的看法? (链接到文档将不胜感激)我是否完全误解了@Nonnull 在方法上的使用?
[编辑]
经过一些研究,我决定 org.jetbrains @Contract注释(契约(Contract)违规更改为错误)将更好地满足我的需求。感谢 Guillaume F. 的帮助!
最佳答案
你必须明白redundant Null-Check是什么意思。当 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>
https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type
关于java - 为什么 findbugs 会为一种方法提供冗余的 nullcheck 而不是另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883893/