我不明白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值。

但是调用者有责任永远不要传递空值,这要通过例如明确的空值检查来确保。

10-08 19:30