返回null或再次抛出异常

时间:2011-01-23 13:14:20

标签: java exception null convention

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

  1. 如果您总是希望找到一个值,则抛出异常(如果缺少)。例外意味着存在问题。如果该值可能丢失或存在且两者都对应用程序逻辑有效,则返回null。
  2. 如果确实是错误,则仅抛出异常。如果对象的预期行为不存在,则返回null。
  3. 但是我应该如何在我的(如此随意的)案例中解释它们: 我的网络应用控制器正在接收显示具有特定ID的用户的详细信息的请求。 Controller要求服务层获取用户,然后服务返回该对象(如果已找到)。如果没有,则会重定向到“默认”位置。

    如果有人在请求网址中传递了无效的用户ID,我该怎么办?我应该将其视为“预期行为”并将null返回给控制器,或者我应该将其称为“问题或意外行为”,从而在服务方法中抛出异常并捕获控制器内部?

    从技术上讲,它毕竟不是一个很大的区别,但我希望通过遵循标准对流来做正确的方法。提前感谢任何建议。

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

3 个答案:

答案 0 :(得分:4)

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

(OTOH如果请求中的用户ID是由来自DB等的其他应用程序自动生成的,则无效的用户ID将是意外的,因此异常是合适的。)

答案 1 :(得分:0)

我的个人建议是记录错误详细信息(IP地址,无效的用户ID),并将用户重定向到错误页面,该页面表示发生了一些错误并且已通知管理员。点击so-n-so链接返回主页等。

指出,无论是抛出异常还是返回null,只需确保最外面的过滤器或处理程序在将响应返回给用户之前“记录”详细信息。

答案 2 :(得分:0)

What should I do when someone passes invalid user id inside the request URL?

您有两种选择:显示您提到的“默认”页面或返回“未找到”/ 404.

关于 null ,它取决于。如果你认为 null 对引用不可接受,那么用@NotNull注释它,注释 在得到 null时负责做正确的事情引用:即抛出(未经检查的)异常(当然,您需要使用令人惊奇的@NotNull注释才能使其工作)。

你在连锁店中做的更高的事情取决于你:对我来说,给那些试图伪造用户ID的人返回404听起来非常接近最佳状态。