@Nullable注释用法


346

我在Java中看到一些声明为的方法:

void foo(@Nullable Object obj)
{ ... }

有什么意义@Nullable吗?这是否意味着输入可能是null

如果没有注释,输入仍然可以为null,所以我猜不仅仅是吗?


3
从下面的答案中,我了解到注释表明可以接受空值,使用该注释的示例,我可以尝试的代码分析器以及解释可能会有所不同。明白为什么这种格式是一种好格式吗?全面+1,尤其是问这个问题时。
icedwater

8
@Nullable根据您的问题提供哪个图书馆?是Checker吗?
8bitjunkie

Answers:


366

它清楚地表明该方法接受空值,并且如果您覆盖该方法,则还应该接受空值。

它也为诸如FindBugs之类的代码分析器提供了提示。例如,如果这样的方法取消引用其参数而不先检查null,则FindBugs将发出警告。


82

此注释通常用于消除NullPointerExceptions@Nullable表示此参数可能是null。在Google Guice中可以找到这种行为的一个很好的例子。在这个轻量级的依赖注入框架中,您可以确定此依赖可能是null。如果您尝试通过null没有注释的框架,那么框架将拒绝执行此任务。

注释@Nullable可以使用更多内容@NotNull。在这里,您可以找到有关如何正确使用它们的一些提示。IntelliJ中的代码检查可检查注释并帮助调试代码。



1

当然,在我的世界中,肯定有不同的想法,我不能强制执行“永不传递null”,因为我正在与不可控制的第三方(例如API调用者,数据库记录,前程序员等)打交道,因此我对方法抱有偏执和防御性。由于您使用的是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...这样您的意图就很清楚了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.