Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javax.annotation.Nonnull vs assert_Java_Assert_Findbugs_Null Check - Fatal编程技术网

javax.annotation.Nonnull vs assert

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注释,是否可以删除断言行 据我所知,注释仅在静态分析期间

我在方法参数上使用Findbugs和javax.annotation.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之外)运行该断言,并在发现严重问题时使构建失败。