ChatGPT解决这个技术问题 Extra ChatGPT

@Nullable 注解用法

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

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

这里的 @Nullable 是什么意思?这是否意味着输入可能是null

没有注释,输入仍然可以为空,所以我猜这不仅仅是它?

从下面的答案中,我了解到注释表明空值是可以接受的、使用它的示例、我可以尝试的代码分析器以及解释可能会有所不同。看看为什么这种格式很好?全面+1,尤其是问这个问题。
根据您的问题,哪个库提供了 @Nullable?是Checker?

k
kevinarpe

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

它还可以作为 FindBugs 等代码分析器的提示。例如,如果此类方法取消引用其参数而不首先检查 null,则 FindBugs 将发出警告。


M
Mike Rapadas

此注解通常用于消除 NullPointerExceptions@Nullable 表示此参数可能是 null。在 Google Guice 中可以找到此类行为的一个很好的示例。在这个轻量级依赖注入框架中,你可以看出这个依赖可能是 null。如果您尝试在没有注释的情况下通过 null,框架将拒绝完成它的工作。

此外,@Nullable 可能与 @NotNull 注释一起使用。您可以在此处find一些关于如何正确使用它们的提示。 IntelliJ 中的代码检查检查注释并帮助调试代码。


m
mernst

不同的工具可能会以不同的方式解释 @Nullable 的含义。例如,Checker FrameworkFindBugs 处理 @Nullable differently


M
Manabu Tokunaga

诚然,肯定有不同的想法,在我的世界里,我不能强制执行“从不传递空值”,因为我正在与无法控制的第三方打交道,比如 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... 命名参数,这样您的意图就很清楚了。


使用 Optional 作为 if 语句的替换这是一种反模式,因为它不必要地创建了一个新对象。 Optional 的创建者在这里提到了这一点:youtube.com/embed/Ej0sss6cq14?start=1664&end=1800