您对在应用程序中使用CheckedExceptions和RuntimeExceptions有何看法?我被建议使用两者的组合,据我所知,你可以将一连串的CheckedException调用与RuntimeException一起传播。
答案 0 :(得分:14)
只有在您可以合理地期望调用者处理它们时,才应抛出已检查的异常。否则抛出一个RuntimeException(它不要求你声明它或者处理程序捕获它。这是Spring JDBC采用的方法)。
来自Sun here的更多详情。
如果可以合理地期望客户端从异常中恢复,请将其作为已检查的异常。如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常。
答案 1 :(得分:4)
答案 2 :(得分:2)
Joel发布的链接的一个很好的补充可以在:
答案 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)
已检查的异常是预期的异常。您可以抛出或捕获已检查的异常。通过捕获它,异常的恢复是由类本身完成的。通过抛出已检查的异常,您可以在类外部公开异常,并让局外人处理异常。
由于程序中的错误而导致运行时异常。如果在类中发生运行时异常,则除了另一个类之外,不能处理该异常。所以,通常不会抛出运行时异常。