运行时异常和错误
Posted
技术标签:
【中文标题】运行时异常和错误【英文标题】:RuntimeException & Error 【发布时间】: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 这个约定,就像任何约定一样,是任意的。
【参考方案1】:
Error
和RuntimeException
都是未经检查的异常,这意味着它表明程序存在缺陷,通常不应被捕获。 (NullPointerException
、IndexOutOfBoundsException
等)
我认为两者之间的主要区别在于RuntimeException
表示程序存在错误,而Error
是致命但不受程序控制的东西。 (OutOfMemorryError
、ThreadDeath
等)
因此子类化Error
是不好的做法,因为错误通常不是您的程序在运行时可以修复的问题。在您的程序中,如果您需要扔东西,请使用Exception
。
【讨论】:
我将我认为应该回答您问题的部分加粗 程序在运行时无法修复的其他问题是代码中的错误。因此,断言异常可以合法地继承Error
(或者更好的是,AssertionError
是 Error
的子类)。【参考方案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
...
因为Exception
是RuntimeException
的超类型,所以作为一个包罗万象的情况。但你几乎永远不会看到(我从未见过)
try
...
catch (Error e)
...
【讨论】:
以上是关于运行时异常和错误的主要内容,如果未能解决你的问题,请参考以下文章