我不知道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是不必要的,当它显然不是时(它表示条件总是为假)。
答案 0 :(得分:2)
您可能知道空指针异常是Java的常见故障情况。当编译看到代码作为第二种情况时,它将显示警告。
由于固有的复杂性,流量分析最好在小块中进行。一次分析一个方法将获得良好的性能,这个优点是分析会很快,编译器可以在你输入时发出警告。但是黑暗的一面是分析无法看到哪些值在方法之间运行(作为参数或返回)。这是第三种情况下它不会显示任何警告的原因。正如 EJP 所说它会检查运行时。
@NonNull 表示null不是合法值。
这里的空注释变得很重要。通过定义@NonNull注释,您可以告诉编译器您不希望位置为空值。
但是调用者有责任永远不传递空值,例如,通过显式空值检查来确保空值。