javax.annotation.Nonnull vs assert

Gua*_*sta 14 java assert findbugs null-check

我在方法参数上使用Findbugs和javax.annotation.Nonnull.

在私有方法上,我通常添加一个断言行来检查null

private void myMethod(@Nonnull String str) {
    assert str != null
    ....
Run Code Online (Sandbox Code Playgroud)

最新的Netbeans版本(7.3rc2)报告断言检查不是必需的(因为Nonnull注释).我不完全确定这是一个Netbeans错误.

可以删除断言行,因为我指定了@Nonnull注释吗?

据我所知,注释仅在静态分析期间使用,而assert在启用时在执行期间处于活动状态,因此两个不是替代.

Chr*_*ssy 13

断言在运行时进行评估,该注释有助于FindBugs在运行时分析期间捕获问题.由于两个检查都没有真正冲突,你可以保留它们.如果我的IDE告诉我删除断言,我会觉得很烦人.


Dav*_*der 8

Netbeans是对的.如果您认为它可以为null:删除注释.如果您知道它不能:删除断言.

如果有可能使用空值调用您的方法,那么@Nonnull注释不应该存在.

就像你说的那样,该注释实际上并没有在运行时做任何事情:它仅由IDE和静态代码分析工具使用.它不能确保事物不为空.

  • 实际上开发人员都想要两者.当代码分析未涵盖的某些事情发生时,断言将使其快速失败.注释将突出显示开发过程中的错误.所以,虽然你的回答在理论上是正确的,但我不建议删除任何东西. (4认同)
  • 通过添加注释,我告诉 Findbugs “带注释的元素不能为空”。Findbugs 将检查对该方法的所有调用,以确保该参数永远不会为空。所以需要注释(在这种情况下)。问题是“断言有用还是没有用?”。Findbugs 在分析中可能是错误的,因此断言可以涵盖 Findbugs 未检测到的动态情况 (2认同)