RuntimeException & Error

2022-09-01 19:02:33

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

两者之间的区别在于:RuntimeException下的那些是由糟糕的编程/设计引起的,而Error是不能/不应该由开发人员控制的。

例如,为了对应用程序中的异常进行编码,以便在业务逻辑中发生某些情况时引发异常,RuntimeException 进行了扩展。

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


答案 1

两者和都是未经检查的异常,这意味着它表示程序存在缺陷,通常不应捕获。(、等)ErrorRuntimeExceptionNullPointerExceptionIndexOutOfBoundsException

我认为两者之间的主要区别在于表明程序存在错误,而a是致命的,但不受程序的控制。(、等)RuntimeExceptionErrorOutOfMemorryErrorThreadDeath

因此,对 Error 进行子类化是一种不好的做法,因为错误通常不是程序在运行时可以修复的。在你的程序中,如果需要抛出一些东西,请使用 .Exception


答案 2

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

您已经提到了主要区别。Java语言规范用不同的术语说同样的事情。对于 ,它声明Error

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

对于 ,它声明RuntimeException

该类是 Exception 的直接子类。 是表达式计算期间可能由于多种原因而引发的所有异常的超类,但仍可以从中恢复RuntimeExceptionRuntimeException

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

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

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

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

推荐