2013-12-09 56 views
15

在例外层次结构中, RuntimeException的后代和Error的后代是运行时异常/错误。RuntimeException&Error

这两者之间的区别是:那些RuntimeException下是 差引起的编程/设计的那些,和那些的Error是 不能/不应由显影剂所控制的那些。

为了编码应用程序中的异常,例如 ,当发生业务逻辑中的某事时抛出异常, RuntimeException被扩展。

的问题是,究竟是扩展 RuntimeException和扩展Error之间的区别 - 除了延长 Error是不好的做法?

+0

谁说它*是坏习惯?当然不是你每天都会做的事情,但我并不怀疑有些情况下它可能是值得的。 –

+0

@HotLicks Joshua Bloch建议在他的着作Effective Java中这样做:“虽然Java语言规范并不要求它,但有一个强大的约定,即错误被JVM用来指示资源缺陷,不变的故障或其他由于几乎普遍接受这个约定,所以最好不要使用 来实现任何新的Error子类。因此,**所有未实现的可执行的throwables应该继承** RuntimeException(直接或间接的)。” – alfasin

+0

@alfasin - 因此XYZ操作系统可能在检索系统时钟时检测到硬件故障,但它不应该调用该错误?一个控制化学工厂阀门的API可能会检测到硬件故障,并且不应该将其称为错误? –

回答

15

ErrorRuntimeException都是未经检查的例外,这意味着它表示程序存在缺陷,通常不应被捕获。 (NullPointerExceptionIndexOutOfBoundsException等)

我认为两者之间的主要区别是,RuntimeException表明存在有该程序的错误,并且Error的东西是致命的,但出来的程序的控制。 (OutOfMemorryErrorThreadDeath等)

因此继承的Error是不好的做法,因为错误通常是没有的东西,可能你的程序在运行时固定。在你的程序中,如果你需要扔东西,请使用Exception

+1

我已经在Q. – Roam

+0

中说过这些了,我认为应该回答你的问题 – Pita

+1

再加粗。也许这次它会说不会在Q. – Roam

6

的Q是,究竟是扩展 RuntimeException的和不同之处在于扩展错误扩展Error--是 不好的做法有什么区别?

你已经提到了主要的区别。 The Java Language Specification says the same thing in different terms。对于Error,它指出

Error是从普通 程序不是通常预期的恢复的所有异常的超类。

对于RuntimeException,它指出

RuntimeException是异常的直接子类。 RuntimeException是所有异常的超类,可能是 在表达式评估期间抛出的原因很多,但从中可以得出 仍可能回收

你应该从这些报价拿走的是,你通常会看到

try { 
    ... 
} catch (Exception e) { // catches RuntimeException 
    ... 
} 

为包罗万象的情况下,因为Exception是一个超级类型的RuntimeException。但你几乎永远不会看到(我从来没有见过)

try { 
    ... 
} catch (Error e) { 
    ... 
}