javax.annotation.Nonnull vs assert

2022-09-03 13:33:41

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

在私有方法上,我通常会添加一个断言行来检查空性,例如

private void myMethod(@Nonnull String str) {
    assert str != null
    ....

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

是否可以因为我指定了@Nonnull注释而删除断言行?

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


答案 1

断言在运行时进行评估,注释可帮助 FindBugs 在运行时之前的分析期间捕获问题。由于这两个检查并不真正冲突,因此您可以同时保留它们。如果我的IDE告诉我删除断言,我会觉得很烦人。


答案 2

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

如果有可能使用 null 值调用您的方法,则不应存在注释。@Nonnull

就像你说的,这个注释实际上在运行时不会做任何事情:它只被IDE和静态代码分析工具使用。它不能确保事情不为空。