使用库检查空值比获取 NPE 有何优势?
How is using libraries checking nulls better than getting NPE?
有时我看到开发人员使用像 Guava 的 Preconditions 这样的库来验证方法开头的参数是否为 null。这与在运行时获取 NPE 有何不同,因为运行时异常以任何一种方式发生?
编辑:如果有充分的理由,那么开发人员不应该使用库对所有方法进行空检查吗?
有多种原因。正如评论中所提到的,一个重要的问题是在完成任何工作之前预先完成检查。一种方法具有从不取消引用特定参数的代码路径的情况并不少见,在这种情况下,如果不进行预先检查,对该方法的无效调用有时可能不会产生异常。目标是确保它们 总是 产生异常,以便立即捕获错误。也就是说,如果我要立即在下一行或其他地方取消引用参数,我不一定要使用 checkNotNull
。
还有构造函数的情况,您希望在将参数分配给字段之前 checkNotNull
,但我认为这不是您在谈论的内容,因为您在谈论方法无论如何都会使用该参数。
一些原因是:
- 防止代码在第一次取消引用变量(可能为 null)之前 运行。
- 您可以自定义错误消息,例如 "myVar was null, I can't proceed further",或任何在日志中看起来更好且更易于追踪的相关消息。正常的 NPE 在日志中的可读性较差。
- 代码的可读性更好(可以说),因为阅读这段代码的程序员会立即意识到这些值应该是非空的。
归根结底,这是 IMO 的品味问题。我见过本质上是 null 安全并且根本不需要前置条件的程序。
有时我看到开发人员使用像 Guava 的 Preconditions 这样的库来验证方法开头的参数是否为 null。这与在运行时获取 NPE 有何不同,因为运行时异常以任何一种方式发生?
编辑:如果有充分的理由,那么开发人员不应该使用库对所有方法进行空检查吗?
有多种原因。正如评论中所提到的,一个重要的问题是在完成任何工作之前预先完成检查。一种方法具有从不取消引用特定参数的代码路径的情况并不少见,在这种情况下,如果不进行预先检查,对该方法的无效调用有时可能不会产生异常。目标是确保它们 总是 产生异常,以便立即捕获错误。也就是说,如果我要立即在下一行或其他地方取消引用参数,我不一定要使用 checkNotNull
。
还有构造函数的情况,您希望在将参数分配给字段之前 checkNotNull
,但我认为这不是您在谈论的内容,因为您在谈论方法无论如何都会使用该参数。
一些原因是:
- 防止代码在第一次取消引用变量(可能为 null)之前 运行。
- 您可以自定义错误消息,例如 "myVar was null, I can't proceed further",或任何在日志中看起来更好且更易于追踪的相关消息。正常的 NPE 在日志中的可读性较差。
- 代码的可读性更好(可以说),因为阅读这段代码的程序员会立即意识到这些值应该是非空的。
归根结底,这是 IMO 的品味问题。我见过本质上是 null 安全并且根本不需要前置条件的程序。