javax.annotation.Nonnull vs assert
我在方法参数上使用Findbugs和javax.annotation.Nonnull 在私有方法上,我通常添加一个断言行来检查空值,如javax.annotation.Nonnull vs assert,java,assert,findbugs,null-check,Java,Assert,Findbugs,Null Check,我在方法参数上使用Findbugs和javax.annotation.Nonnull 在私有方法上,我通常添加一个断言行来检查空值,如 private void myMethod(@Nonnull String str) { assert str != null .... 最新的Netbeans版本(7.3rc2)报告无需进行断言检查(因为注释为非空)。我不完全确定这是否是Netbeans错误 由于我指定了@Nonnull注释,是否可以删除断言行 据我所知,注释仅在静态分析期间
private void myMethod(@Nonnull String str) {
assert str != null
....
最新的Netbeans版本(7.3rc2)报告无需进行断言检查(因为注释为非空)。我不完全确定这是否是Netbeans错误
由于我指定了@Nonnull注释,是否可以删除断言行
据我所知,注释仅在静态分析期间使用,而当启用assert时,它在执行期间处于活动状态,因此这两个注释不是可选的。Netbeans是正确的。如果您认为它可以为null:删除注释。如果您知道它不能:删除断言 如果有可能使用空值调用您的方法,那么
@Nonnull
注释不应该存在
正如您所说,该注释在运行时实际上并没有做任何事情:它仅由IDE和静态代码分析工具使用。它不能确保事物不是空的 因为这是私有方法,所以我们可以确保带注释的参数不能为null。我想你可以删除这个断言 若NetBeans向public方法发出警告,我认为它有问题。我建议你把这句话写下来 若您仍然认为私有方法中的断言是必要的,那个么我认为您可以使用字节码注入。 例如,这里有一个maven插件来注入空检查。对不起,这是我的个人项目,但对我来说很有用。我想它能满足你的需要。
断言在运行时进行评估,注释有助于FindBugs在运行前的分析过程中发现问题。由于这两种检查实际上并不冲突,您可以同时保留它们。如果IDE告诉我删除断言,我会觉得很烦人。我找到了一个不同的解决方案,因为我在考虑IDE警告 起初,我觉得IDE是错误的。我是一个偏执的程序员,希望有一个文档标签&静态分析和运行时检查,以防我从反射、另一种JVM语言或不可静态分析的东西中使用它,所以我认为给我一个警告并告诉我不需要
assert(x!=null)
语句是错误的
但随后我考虑了如何根据运行时传递给Java的-ea
标志的状态删除断言,并且在某些方面assert
和@Nonnull
实际上都是仅用于开发的检查
事实证明,可以插入一个实际的运行时检查(Java7+),它将抛出一个NullPointerException
,并且不能用-ea
断言删除。我想我更喜欢这个而不是我的断言(x!=null);使用(x)代码>模式
public ConstructorForClass(@Nonnull Type x) {
this.x = Objects.requireNonNull(x);
//...
}
在这个例子中,我假设参数永远不应该为null。通过添加注释,我告诉Findbugs“被注释的元素不能为null”。Findbugs将检查对该方法的所有调用,以确保参数永远不为null。因此需要注释(在本例中)。问题是“断言是否有用?”。Findbugs在分析中可能是错误的,因此断言可以覆盖Findbugs未检测到的动态情况,而实际上开发人员希望两者兼而有之。当发生代码分析未涵盖的事情时,断言将使其快速失败。注释将突出显示开发过程中的错误。所以,虽然你们的答案在理论上是正确的,但我不建议你们删除任何东西。FindBugs确实不是防弹的,它努力寻找问题,但它并不总是有效的。断言是您运行时的安全网。请参见Programmers.SE.lombok.NonNull
为您添加代码。不仅FindBugs,而且IntelliJ等现代IDE也在其分析中使用它。是的,IDE一直在迎头赶上,但我也喜欢在构建期间(在IDE之外)运行该断言,并在发现严重问题时使构建失败。