我不明白NonNull注释应该如何提供帮助。因此,假设我有这个:
void noNullArg(@NonNull Object o)
{
// stuff
}
如果执行此操作,则会收到有关“o”可能为空的警告。
void foo()
{
Object o = null;
noNullArg(o);
}
但是,如果我改为执行此操作,则根本不会收到任何警告。
void sendNull()
{
// Pass null and violate the annotation
foo(null);
}
void foo(Object o)
{
noNullArg(o);
}
这是一个微不足道的案例,未被发现。最重要的是,编译器似乎认为,如果设置了@NonNull,则不必检查null,而显然不是这样(它表示条件始终为false)。
最佳答案
您可能知道空指针异常是Java的非常常见的失败案例。编译时将代码作为第二种情况,它将显示警告。
由于固有的复杂性,流量分析最好在小块中执行。一次分析一个方法将具有良好的性能,其优点是分析速度很快,编译器会在您键入时警告您。但不利的一面是,分析无法看到方法之间正在运行哪些值(作为参数或返回值) 。这就是第三种情况下它不会显示任何警告的原因。正如 EJP 所说,它将检查运行时。
@NonNull 表示null不是合法值。
在这里,空注释变得很重要。通过定义@NonNull批注,您可以告诉编译器您不希望在位置上使用null值。
但是调用者有责任永远不要传递空值,这要通过例如明确的空值检查来确保。