使用 @NonNull 检查 input==null 与抛出 NPE

Checking input==null with @NonNull vs letting NPE be thrown

public void test(@NonNull String input){
    #1 log(input.length());
}
  1. 使用 lombok @NotNull 注释删除样板代码。但是,如果将 null 作为输入传递,它最终也会抛出 NPE(默认情况下)。那么使用@NonNull 与让 NPE 在第 1 行抛出有什么区别?

public void test(String input){
if(input ==null){
    throw NPE;
}
log(input.length());
}
  1. 类似地,如果输入为空并且可以对其进行一些处理(e.x。设置默认值或如果为空则绕过块),那么进行显式检查是有意义的为空。否则做这个检查有什么意义吗?不进行空检查并抛出 NPE 是否更好?如果这个问题的答案是,不做空检查,那为什么 Lombok @NonNull 存在?

"Fail fast" 将帮助您避免不必要的副作用。如果您的方法在 20 行之后取消引用您的 null 参数,并且在之前的 19 行内,某些状态已经更改(写入日志文件、启动事务、某些文件或 OutputStream 创建)怎么办?通常,如果违反了 API 约定(参数不能为空),您不希望执行任何方法表达式。