我们有Throwable
类,它是Error
类的基类(对于不可恢复的错误)和Exception
类(对于可恢复的}强>错误)
所以,
1> 我们可以 throw
实现error
类的对象。(虽然实现{{1}没有意义因为我们有Error
类来做同样的事情。)
2> Java不建议捕获Exception
个对象..
那么Error
对象的需求是什么呢?编译器不能在内部实现它吗?这不是一个错误吗?
答案 0 :(得分:7)
您当然可以抛出扩展(未实现)Error
类的对象。
正如您所说,Error
存在不可恢复的错误。最广泛的用途是在JVM本身内部,它使用Error
的子类来处理无法恢复的内容,并且不希望您能够从中恢复 - 例如内存不足。
答案 1 :(得分:7)
从技术上讲,“不可恢复的错误”和“可恢复的错误”之间并没有真正的区别,而是在已检查的异常和未经检查的异常之间。 Java 区分它们如下:
throws
子句中声明已检查的例外;如果使用在try
块中抛出已检查异常的方法,则必须catch
表示异常或将此异常添加到方法的throws
子句中; throws
子句中声明一个未经检查的异常(不推荐);如果使用在try
块中抛出未经检查的异常的方法,则可能 catch
该异常或将此异常添加到方法的throws
子句中(不推荐)任一)。当然不建议使用,除非你真的知道你在做什么,就是“吞下”任何类型的未经检查的异常(即catch
带有空块)。
Exception
是基础检查异常类; Error
和RuntimeException
都是未经检查的异常,所有子类都是如此。您将注意到所有三个类都扩展为Throwable
,而Throwable
的javadoc指出:
出于编译时检查异常的目的,Throwable和 Throwable的任何子类,也不是它们的子类 RuntimeException或Error被视为已检查的异常。
着名的未经检查的例外的经典例子:
OutOfMemoryError
(扩展Error
); StackOverflowError
(扩展Error
); NullPointerException
(扩展RuntimeException
); IllegalArgumentException
(扩展RuntimeException
); Error
和RuntimeException
之间唯一真正的区别在于它们的估计严重程度,并且是“语义”差异,而不是技术差异:最终,两者的行为相同。如果你遇到一个Error
但是没有重新抛出它,那么一些IDE(Intellij IDEA会浮现在脑海中)也会对你大喊大叫。
答案 2 :(得分:5)
错误的javadoc说
错误是Throwable的子类,表示严重问题 一个合理的应用程序不应该试图抓住。最多的 错误是异常情况。
而对于Exception,javadoc说
类Exception及其子类是Throwable的一种形式 表示合理的应用程序可能想要的条件 捉。
一些差异
Java中的Error和Exception之间存在差异。要记住的关键点是错误本质上是致命的,并且可能无法进行恢复,另一方面,通过仔细处理异常,您可以使代码更加健壮并防范不同的场景。
查看一些Error的子类,取自各自的javadoc:
AnnotationFormatError - 注释解析器尝试时抛出 从类文件中读取注释并确定 注释格式不正确。
AssertionError - 抛出以指示断言失败。
LinkageError - LinkageError的子类表示类有 一些依赖于另一个类;然而,后一类有 在编写前一课后不一致地改变了。
VirtualMachineError - 抛出以指示Java虚拟机 被破坏或已经耗尽了继续所需的资源 操作
答案 3 :(得分:3)
错误是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。
类Exception及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件。
我认为这使得区别清晰。另请注意,两者都从throwable继承,因此都可以抛出。