我不明白NonNull注释应该有什么帮助。所以,假设我有这个:
void noNullArg(@NonNull Object o)
{
// stuff
}
如果我这样做,我会收到一个关于"o"可能为null的警告。
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不是合法值。
在这里,null注释变得很重要。通过定义@NonNull注释,您可以告诉编译器您不希望在位置中有null值。
但调用方的责任是永远不要传递null值,这是要确保的,例如,通过显式null检查。