NonNull注释有什么意义?

时间:2015-12-09 04:36:12

标签: java android

我不知道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是不必要的,当它显然不是时(它表示条件总是为假)。

1 个答案:

答案 0 :(得分:2)

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

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

@NonNull 表示null不是合法值。

这里的空注释变得很重要。通过定义@NonNull注释,您可以告诉编译器您不希望位置为空值。

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