【发布时间】:2013-12-26 00:50:17
【问题描述】:
在异常层次结构中,
RuntimeException 和 Error 是运行时异常/错误。
两者的区别是:RuntimeException下的是
由糟糕的编程/设计引起的那些,以及Error 的那些是
那些不能/不应该被开发者控制的。
为了在应用程序中编写异常代码,
例如,当业务逻辑发生某些事情时抛出异常,
RuntimeException 已扩展。
问题是,扩展之间到底有什么区别
RuntimeException 和扩展 Error-- 除了扩展
Error 是不好的做法?
【问题讨论】:
-
谁说它是不好的做法?当然不是你每天都会做的事情,但我不怀疑在某些情况下可能值得这样做。
-
@HotLicks Joshua Bloch 在他的《Effective Java》一书中建议这样做:“虽然 Java 语言规范不需要它,但有一个严格的约定,即保留错误供 JVM 使用以指示资源缺陷、不变的失败或其他导致无法继续执行的条件。鉴于该约定几乎普遍接受,最好不要实现任何新的 Error 子类。因此,您实现的所有未检查的 throwable 都应该子类
RuntimeException(直接或间接)。” -
@alfasin - 所以 XYZ 操作系统可能会在检索系统时钟时检测到硬件故障,但它不应该称之为错误?控制化工厂阀门的 API 可能会检测到硬件故障,并且不应再次将其称为错误?
-
@HotLicks 在同一章中,Joshua 说
RuntimeException应该指出“编程错误”,例如,调用方法时的前置条件无效。您描述的特定情况(硬件故障)可能会使 JVM 崩溃(在这种情况下,将引发Error)但无论如何,它听起来不像“编程错误”。我想答案取决于这样的问题将如何影响您的程序/操作系统。重要的是要记住RuntimeException和Error之间没有行为差异 - 只有语义这就是为什么RuntimeException可能仍然适合。 -
@Hot Licks 这个约定,就像任何约定一样,是任意的。
标签: java runtime-error runtimeexception