0

我想知道如何知道创建和抛出检查异常或未检查异常。

例如,我有一个服务,它需要一些数据并在使用它之前对其进行验证。在验证过程中,某个字段不符合规则,我想抛出一个异常,比如 ValidationException()。我怎么知道决定它应该被选中还是不选中。

在另一种情况下,我从我的代码中调用外部 Web 服务,例如 google stock api。假设我有 3 秒的超时。如果时间到期,我想抛出一个异常,比如 BackendException()。我怎么知道它应该是一个检查的异常还是一个未经检查的异常。

提前致谢。

4

2 回答 2

3

可能会有不同的意见,但我想说不同之处在于调用者应如何处理该异常:

  • 如果您想确保调用者通过执行某些操作(记录、尝试恢复等)或重新抛出来处理异常,请使用受检异常。举个例子ValidationException:如果数据无效,调用者必须处理它,例如告诉某人修复数据或尝试其他方法。(请注意,可能存在未经检查的验证异常javax.validation.ValidationException,例如麻烦。)
  • 如果您不想强制调用者处理通常不应抛出的异常(例如编程错误等),请使用未经检查的异常。这方面的一个例子可能是总是令人恐惧的NullPointerException:不应该发生您想要使用的东西是 null 所以它可能被认为是一个编程错误。如果某些内容可能为 null 但不应该为 null,则您可能希望使用已检查的异常。

    请注意,某些库/方法使用IllegalArgumentException的是未经检查的异常。如果抛出此异常,通常会出现编程错误,即违反了方法的约定(例如,参数值不得为负),调用者应修复代码或自己进行一些检查。

另一种观点可能是:在某些情况下是否期望抛出异常?预期的异常(仍然意味着发生了某种错误)将被检查为异常,因为这样您就可以与调用者沟通,他应该期望在某些情况下抛出这些异常(例如,如果数据无效)。如果异常是意外的,则不应强制调用者处理此类异常,因为您根本不希望它被抛出 - 因此它将是未经检查的异常。

于 2016-09-22T14:31:55.807 回答
1

根据 Joshua Bloch,Book Effective Java,Item 58 将其总结在一行中。拇指规则是对可恢复条件使用检查异常,对编程错误使用运行时异常。

于 2016-09-22T14:33:26.217 回答