我曾经使用很多@NotNull/@Nullable
批注来启用IDE,以帮助我在编译时找出潜在的NPE
。但是,我的新团队不允许使用@NotNull/@Nullable
批注,也不允许像这样的自定义批注。结果,与以前相比,我更有可能编写由NPE
引起的错误。
我尝试了几种解决方案:
Optional<T>
。但是,这并非在每种情况下都很好。通常不建议使用Optional<T>
作为字段或参数的类型。 Optional<T>
实例本身可能是null
也非常令人沮丧。另外,调用ifPresent(obj->...)
时,很难在lambda表达式中操作控制流(在Java 9中更容易)。使用太多的Optional<T>
会使代码有些冗长。 (更新:很遗憾,现在也禁止使用Optional<T>
) @Nullable
。该解决方案确实帮助我发现了一些潜在的错误,但是,IDE建议我检查几乎所有方法调用,这确实很烦人,因为许多方法是有意设计的,没有返回null
。 null
的可能性将通过方法调用传递到任何地方都具有严重的影响。在这种情况下,方法的每个参数都可以是null
,并且当检查参数是否为空时,该方法通常会连续返回null
。最后,每个方法都被“感染”,有可能接收null
参数并返回null
。 Objects.requireNonNull()
可以防止上述问题。它稍微减轻了在任何地方检查null
的麻烦。但是,它不能保证调用者不会将null
传递给不允许null
的情况。一旦传递了null
,则抛出的运行时NPE
更有可能破坏您的应用程序。 关于在编译时检测NPE(并保存我的工作)还有其他建议吗? 我认为可以广泛使用此问题的解决方案,不仅可以帮助自己,因为并非所有团队都允许使用
@NotNull/@Nullable
批注和Optional<T>
。 最佳答案
不是确定的答案,而是一些探索的方法:
希望这可以帮助。