【问题标题】:Checking input==null with @NonNull vs letting NPE be thrown使用 @NonNull 检查 input==null 与抛出 NPE
【发布时间】:2018-10-21 08:28:38
【问题描述】:
public void test(@NonNull String input){
    #1 log(input.length());
}
  1. 使用 lombok @NotNull 注释删除样板代码。但是,如果将 null 作为输入传递,它最终也会引发 NPE(默认情况下)。那么使用@NonNull 与在第 1 行抛出 NPE 有什么区别?

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

【问题讨论】:

  • 如果你的应用程序支持空值,你应该检查空值,在这种情况下你对空对象不做任何事情。或者你可能不想支持空值,结果要么抛出或允许 NPE被抛出,因为你可能希望在特殊情况下做点什么。

标签: java lombok notnull


【解决方案1】:

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

【讨论】:

  • 因此,从本质上讲,如果在故障点之前完成惩罚操作,则最好快速失败。如果有一定的保证,该方法不会做任何繁重的工作,那么抛出 NPE 是否可以?
  • 我认为这是个人喜好问题。我几乎从不抛出自己创建的 NPE,但经常使用Objects.requireNonNull(myParameterArgument),如果传递的变量为空,它会抛出 NPE。但是在使用 Lombok 时,您不需要它。在几乎所有其他情况下,我从不抛出 NPE,但更有可能创建具有有意义名称的自己的异常类型。
  • 另外,lombok 会将参数的名称放在 NPE 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2023-03-06
  • 2021-01-19
  • 2012-12-20
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多