运行时异常和错误

Posted

技术标签:

【中文标题】运行时异常和错误【英文标题】:RuntimeException & Error 【发布时间】:2013-12-26 00:50:17 【问题描述】:

在异常层次结构中, RuntimeExceptionError 是运行时异常/错误。

两者的区别是:RuntimeException下的是 由糟糕的编程/设计引起的那些,以及Error 的那些是 那些不能/不应该被开发者控制的。

为了在应用程序中编写异常代码, 例如,当业务逻辑发生某些事情时抛出异常, RuntimeException 已扩展。

问题是,扩展之间到底有什么区别 RuntimeException 和扩展 Error-- 除了扩展 Error 是不好的做法?

【问题讨论】:

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

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

我认为两者之间的主要区别在于RuntimeException 表示程序存在错误,而Error 是致命但不受程序控制的东西。 (OutOfMemorryErrorThreadDeath等)

因此子类化Error 是不好的做法,因为错误通常不是您的程序在运行时可以修复的问题。在您的程序中,如果您需要扔东西,请使用Exception

【讨论】:

我将我认为应该回答您问题的部分加粗 程序在运行时无法修复的其他问题是代码中的错误。因此,断言异常可以合法地继承 Error(或者更好的是,AssertionErrorError 的子类)。【参考方案2】:

Q 是,扩展和扩展到底有什么区别 RuntimeException 和扩展 Error——除了扩展 Error 是 不好的做法?

您已经提到了主要区别。 The Java Language Specification says the same thing in different terms。对于Error,它声明

Error 是所有普通异常的超类 程序通常不会恢复

对于RuntimeException,它声明

RuntimeException 类是 Exception 的直接子类。 RuntimeException 是所有异常的超类,可能是 在表达式评估期间由于多种原因而抛出,但从中 仍有可能恢复

你应该从这些引用中得到的是你会经常看到的

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

因为ExceptionRuntimeException 的超类型,所以作为一个包罗万象的情况。但你几乎永远不会看到(我从未见过)

try 
   ...
 catch (Error e) 
   ...

【讨论】:

以上是关于运行时异常和错误的主要内容,如果未能解决你的问题,请参考以下文章

ExceptionError运行时异常与一般异常有何异同

Java运行时异常和非运行时异常

11. php的错误和异常处理

符号可见性、异常、运行时错误

异常处理

Java 异常