21

可能重复:
在 Java 中,我应该何时创建已检查异常,何时应创建运行时异常?

RuntimeException我什么时候应该从而不是派生异常Exception

ARuntimeException不必在方法的throws子句中声明,这可能是好的,因为它不必特别列出或不好,因为明确声明方法的异常是一种好习惯。

想法?

4

2 回答 2

62

来自未经检查的例外——争议

如果可以合理地期望客户端从异常中恢复,则使其成为受检异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。

请注意,未经RuntimeException检查的异常是派生自Exception.

RuntimeException如果客户端无法从异常中恢复,为什么还要抛出异常?文章解释说:

运行时异常表示由编程问题引起的问题,因此,不能合理地期望 API 客户端代码从它们中恢复或以任何方式处理它们。此类问题包括算术异常,例如除以零;指针异常,例如试图通过空引用访问对象;和索引异常,例如尝试通过太大或太小的索引访问数组元素。

于 2010-11-20T16:52:56.760 回答
16

在企业应用程序开发中有许多场景,您会使用 RuntimeException 而不是 Exception。以下是两种非常常见的场景:

  • 在实现异常处理作为一个方面(分离关注设计原则)时,在大多数现代框架中,您将声明式处理异常并关联特定的异常处理块,而不是对其进行硬编码。一个很好的例子是 Spring 中的 JDBC 模板,它将所有 SQL 异常转换为 RuntimeException,因此开发人员在编写数据访问逻辑时不会编写 try catch 块。您可以以声明方式定义异常处理程序,该处理程序可以在开发环境中提供不同的行为。以及生产中的不同行为。在 Struts 1.x Action 类中也有类似的实现,其中执行方法被声明为抛出异常,并且在 struts-config 中映射了单独的 ExceptionHandler 用于处理特定的异常。
  • RuntimeException 的另一个用途是在 EJB 和其他事务管理器中,其中事务由容器控制。按照惯例,在此类容器中,如果您从代码中抛出 RuntimeException,则事务将回滚 - 如果您抛出异常,则不会发生同样的情况。

这是我立即想到的两个重要场景,但当然还有其他场景。

于 2010-11-20T16:51:20.180 回答