NonNull注释有什么意义?

Mar*_*her 6 java android

我不知道NonNull注释应该如何帮助.所以,让我说我有这个:

void noNullArg(@NonNull Object o)
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我会收到关于"o"如何为空的警告.

void foo()
{
    Object o = null;
    noNullArg(o);
}
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,我根本不会收到任何警告.

void sendNull()
{
    // Pass null and violate the annotation
    foo(null);
}

void foo(Object o)
{
    noNullArg(o);
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常微不足道的案例,未被发现.最重要的是,编译器似乎认为如果设置@NonNull则检查null是不必要的,当它显然不是时(它表示条件总是为假).

cur*_*ind 5

您可能知道空指针异常是 Java 中非常常见的故障情况。编译时将代码视为第二种情况,它将显示警告。

由于其固有的复杂性,流分析最好以小块的形式进行。一次分析一个方法将获得良好的性能,这一优点是分析速度很快,编译器可以在您键入时发出警告。但缺点是分析无法看到方法之间运行的值(作为参数或返回) 。这就是第三种情况下它不会显示任何警告的原因。正如EJP所说,它将检查运行时。

@NonNull表示 null 不是合法值。

这里空注释就很重要了。通过定义 @NonNull 注释,您可以告诉编译器您不希望在该位置出现空值。

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

  • 没有对@NonNull 执行运行时检查。我刚刚尝试过,即使 @NonNull 参数为 null,该方法也会正常执行。因此,如果它不执行运行时检查,为什么 Lint 告诉我不需要自己在函数内部检查 null 呢?没有实际的保证。我在注释中看到了很多价值,可以通知可能使用该方法的任何人,以便他们知道会发生什么。 (4认同)