我在java中看到一些声明为:
的方法void foo(@Nullable Object obj)
{ ... }
这里@Nullable
的含义是什么?这是否意味着输入可能是null
?
没有注释,输入仍然可以为空,所以我猜这不仅仅是它吗?
由于
答案 0 :(得分:333)
它清楚地表明该方法接受空值,并且如果重写该方法,则还应接受空值。
它还可以作为FindBugs等代码分析器的提示。例如,如果这样的方法取消引用其参数而不先检查null,则FindBugs将发出警告。
答案 1 :(得分:79)
此注释通常用于消除NullPointerExceptions
。 @Nullable
经常说这个参数可能是null
。在Google Guice中可以找到这种行为的好例子。在这个轻量级依赖注入框架中,您可以告诉该依赖关系可能是null
。如果您尝试传递null
而没有注释,框架将拒绝执行此任务。
@Nullable
可以与@NotNull
注释一起使用。在这里,您可以find一些提示如何正确使用它们。 IntelliJ中的代码检查会检查注释并帮助调试代码。
答案 2 :(得分:16)
不同的工具可能会以不同的方式解释@Nullable
的含义。例如,Checker Framework和FindBugs句柄@Nullable
differently。
答案 3 :(得分:2)
当然,在我的世界中,肯定有不同的想法,因为我正在与不可控制的第三方(例如API调用者,数据库记录,前程序员等)打交道,因此我无法强制执行“永不传递null” ...所以我很偏执,防御方法。由于您使用的是Java8或更高版本,因此有比if
块更干净的方法。
public String foo(@Nullable String mayBeNothing) {
return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}
您还可以通过将.orElse
交换为
orElseThrow(() -> new Exception("Dont' send a null"))
。
如果您不想使用@Nullable,它不会在功能上添加任何内容,那么为什么不直接使用mayBe...
命名参数,这样您的意图就清楚了。