我使用的方法参数FindBugs的和javax.annotation.Nonnull。
在私有方法我通常添加断言线检查NULL的含量一样
private void myMethod(@Nonnull String str) {
assert str != null
....
最近的NetBeans版本(7.3rc2)报道称,断言检查是没有必要的(因为非空注释)。 我不能完全肯定这是一个NetBeans错误与否。
可因为我指定的@Nonnull注释断言线被删除?
据我了解,注释是静态分析中仅使用,而断言是,启用时,在执行过程中有效,因此在三三两两不是替代。
断言在运行时计算,注释有助于FindBugs的运行时之前在分析过程中发现问题。 由于这两种检查都没有真正发生冲突,你可以让他们两个。 我会觉得很烦,如果我的IDE叫我删除断言。
NetBeans是正确的。 如果你认为它可以为null:去掉注释。 如果你知道它不能处理:去除断言。
如果有任何机会,你的方法可以用null值调用,然后@Nonnull
注释不应该在那里。
就像你说的,那注释实际上并不在运行时做任何事情:它仅用于IDE和静态代码分析工具。 它并不能保证事情不为空。
由于这是私人的方法,我们可以确保注释参数不能为空。 我想你可以删除这一说法。
如果NetBeans的警告公众的方法,我觉得它有问题。 我建议你把断言。
如果你还是觉得在私有方法断言是必要的,我想你可以使用字节码注入。 举例来说,这里是一个Maven插件注入空检查。 很抱歉,这是我的个人项目,但它的作品给我。 我想这能满足您的需要。 https://github.com/KengoTODA/jsr305-maven-plugin
我发现了一个不同的解决方案,因为我在想我的IDE警告。
起初,我觉得IDE是错误的。 我是一个偏执的程序员,并希望有文档与静态分析和的情况下,运行时检查我曾经使用过的反射,或其他JVM语言或东西是不是静态分析的标签,所以我认为这是错误的给我一个警告,告诉我assert(x != null)
并不需要声明。
但转念一想如何断言可以根据状态来去除-ea
传递到Java运行时的标志,而且在某些方面assert
和@Nonnull
真的都只有发展-检查。
原来,有一个实际的运行时检查可插入(Java 7+) Objects.requireNonNull
这将抛出一个NullPointerException
,并且不能与被删除-ea
断言。 我想我会喜欢这个我assert(x != null); use(x);
assert(x != null); use(x);
图案。
public ConstructorForClass(@Nonnull Type x) {
this.x = Objects.requireNonNull(x);
//...
}