java - 返回 null 或再次抛出异常

标签 java exception null convention

我已经在寻找这个问题的答案,并且找到了以下建议:

  1. 如果您总是希望找到一个值,那么如果找不到则抛出异常。异常意味着有问题。如果该值可以缺失或存在,并且两者都对应用程序逻辑有效,则返回 null。
  2. 只有在确实存在错误时才抛出异常。如果对象不存在是预期的行为,则返回 null。

但我应该如何在我的(如此随意的)案例中解释它们: 我的 Web 应用程序 Controller 正在接收请求以显示具有特定 ID 的用户的详细信息。 Controller 要求服务层获取用户,然后服务返回对象(如果找到)。如果不是,则会发出到“默认”位置的重定向。

如果有人在请求 URL 中传递了无效的用户 ID,我该怎么办?我应该将其视为“预期行为”并将 null 返回给 Controller ,还是应该将其称为“问题或意外行为”并因此在服务方法内抛出异常并在 Controller 内捕获?

从技术上讲,这毕竟没有太大区别,但我想按照标准约定以正确的方式进行操作。提前感谢您的任何建议。

编辑: 我假设应用程序生成的 URL 有效且存在 - 当用户单击时,应该找到具有特定 ID 的用户。我想知道如何处理这种情况,当用户尝试通过在浏览器的地址栏中手动输入 URL 来访问具有错误(不存在)用户 ID 的 URL 时。

最佳答案

如果我没理解错的话,包含用户 ID 的请求来自客户端(不受您的控制)。应用您引用的经验法则:无效的用户输入是完全可以预料的情况,不需要异常,而是通过向客户端返回适当的错误消息来优雅地处理空值。

(OTOH 如果请求中的用户 ID 是由另一个应用程序自动生成的/来自数据库等,无效的用户 ID 将是意外的,因此异常(exception)是适当的。)

关于java - 返回 null 或再次抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4773999/

相关文章:

java - 无法有效地使用 Java 中的 Multi Catch

java - 将 Tab 字符粘贴到 TextField 时破坏 JavaFX

c++ - 'wrap' 异常是个好主意吗?

android - getParcelableExtra 在 Pending Intent 上总是 null,但不是 Intent

java - Spring Boot 不会替换 Spring Tool Suite 版本 : 3. 8.4.RELEASE 中的系统变量 {user.home}

Java:外部文本文件的相对路径

objective-c - iOS:NSString变量返回null

mysql 在重复键上插入更新 - 当 col 具有默认 null 时的奇怪行为

java - 如何将每个 RDD 分区限制为仅 'n' 条记录?

java - Android Dialog 和 AsyncTask 导致 UI 卡住