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