NonNull注释的意义何在

  • 本文关键字:注释 NonNull java android
  • 更新时间 :
  • 英文 :


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

最新更新