使用RuntimeExceptions和CheckedExceptions

时间:2009-12-16 10:13:28

标签: java exception-handling

您对在应用程序中使用CheckedExceptions和RuntimeExceptions有何看法?我被建议使用两者的组合,据我所知,你可以将一连串的CheckedException调用与RuntimeException一起传播。

7 个答案:

答案 0 :(得分:14)

只有在您可以合理地期望调用者处理它们时,才应抛出已检查的异常。否则抛出一个RuntimeException(它不要求你声明它或者处理程序捕获它。这是Spring JDBC采用的方法)。

来自Sun here的更多详情。

  

如果可以合理地期望客户端从异常中恢复,请将其作为已检查的异常。如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常。

答案 1 :(得分:4)

我同意乔尔。

查看故障屏障模式:link text

请记住,已检查的异常不应公开您方法的内部机制。

答案 2 :(得分:2)

答案 3 :(得分:2)

在我看来,检查异常是一个java设计缺陷(例如,C#似乎从中学到了东西,只提供未经检查的异常)。 Sun表示如果客户可以恢复,您应该使用已检查的例外。问题是,作为api开发人员,你只是不知道,你可以期待什么样的客户端( - >他们可以恢复或不恢复?)。因此,您不应该将这种不确定性映射到您的api。所以我会选择未经检查的例外。

在我看来,在考虑“合理的客户处理”时,经常会发生污染你的api。 IOException和RemoteException是着名的“烦人检查异常”示例。在实践中,他们大多数时间没有理由被客户处理。当然,在极少数情况下,它们是有意义的处理。所以看着这个我尝试设计友好的api客户端并避免检查异常的负担。当然,在使用未经检查的异常时,必须记录它们(例如通过javadoc)。

由于Java的兼容性很差,因此检查/取消检查的可能性永远不会改变。

有关更多详细信息和具体示例,请查看我之前做过的博文:Getting rid of checked exceptions

由于以下几个原因,我有时仍会使用已检查的异常:

  • 现有的代码库很大,并且大量使用已检查的异常。考虑到好处,重构未经检查的异常的努力太高了。
  • 大多数团队认为检查异常有点好,我们在几个公约上民主地达成了协议。

答案 4 :(得分:1)

已检查的异常是您预期并可以处理的内容 - 例如IO异常或数据库连接异常。此外,用户创建的异常也会受到检查异常。

运行时或未经检查的异常是您未预料到的 - 它们是由于代码中的逻辑缺陷而发生的,例如,arrayindexoutofbounds异常,空指针异常。

而且,想一想,作为一名程序员,你可以创建一个能够很好地运行并且逻辑合理的代码,并且你不会预料到逻辑缺陷。而且,如果有的话,JVM会捕获并崩溃系统。

希望它有所帮助。

答案 5 :(得分:0)

  • 您应该在那里使用未经检查的例外 是你自己的代码和错误 申请无法合理恢复 从错误,即错误。
  • 使用已检查的例外来处理错误 控制您的应用程序,例如糟糕 用户输入和数据库连接错误。

答案 6 :(得分:0)

已检查的异常是预期的异常。您可以抛出或捕获已检查的异常。通过捕获它,异常的恢复是由类本身完成的。通过抛出已检查的异常,您可以在类外部公开异常,并让局外人处理异常。

由于程序中的错误而导致运行时异常。如果在类中发生运行时异常,则除了另一个类之外,不能处理该异常。所以,通常不会抛出运行时异常。