为什么我们需要Error类?

时间:2013-01-07 13:18:04

标签: java exception-handling

我们有Throwable类,它是Error类的基类(对于不可恢复的错误)和Exception类(对于可恢复的错误)

所以,

1> 我们可以 throw实现error类的对象。(虽然实现{{1}没有意义因为我们有Error类来做同样的事情。)

2> Java不建议捕获Exception个对象..


那么Error对象的需求是什么呢?编译器不能在内部实现它吗?这不是一个错误吗?

4 个答案:

答案 0 :(得分:7)

您当然可以抛出扩展(未实现)Error类的对象。

正如您所说,Error存在不可恢复的错误。最广泛的用途是在JVM本身内部,它使用Error的子类来处理无法恢复的内容,并且不希望您能够从中恢复 - 例如内存不足。

答案 1 :(得分:7)

从技术上讲,“不可恢复的错误”和“可恢复的错误”之间并没有真正的区别,而是在已检查的异常和未经检查的异常之间。 Java 区分它们如下:

  • 必须throws子句中声明已检查的例外;如果使用在try块中抛出已检查异常的方法,则必须catch表示异常或将此异常添加到方法的throws子句中;
  • 可以在你的throws子句中声明一个未经检查的异常(不推荐);如果使用在try块中抛出未经检查的异常的方法,则可能 catch该异常或将此异常添加到方法的throws子句中(不推荐)任一)。

当然不建议使用,除非你真的知道你在做什么,就是“吞下”任何类型的未经检查的异常(即catch带有空块)。

Exception是基础检查异常类; ErrorRuntimeException都是未经检查的异常,所有子类都是如此。您将注意到所有三个类都扩展为Throwable,而Throwable的javadoc指出:

  

出于编译时检查异常的目的,Throwable和   Throwable的任何子类,也不是它们的子类   RuntimeException或Error被视为已检查的异常。

着名的未经检查的例外的经典例子:

  • OutOfMemoryError(扩展Error);
  • StackOverflowError(扩展Error);
  • NullPointerException(扩展RuntimeException);
  • IllegalArgumentException(扩展RuntimeException);
  • 等等。

ErrorRuntimeException之间唯一真正的区别在于它们的估计严重程度,并且是“语义”差异,而不是技术差异:最终,两者的行为相同。如果你遇到一个Error但是没有重新抛出它,那么一些IDE(Intellij IDEA会浮现在脑海中)也会对你大喊大叫。

答案 2 :(得分:5)

错误的javadoc说

  

错误是Throwable的子类,表示严重问题   一个合理的应用程序不应该试图抓住。最多的   错误是异常情况。

而对于Exception,javadoc说

  

类Exception及其子类是Throwable的一种形式   表示合理的应用程序可能想要的条件   捉。

一些差异

  1. 错误并不意味着被抓住,即使你抓住它也无法从中恢复。例如,在 OutOfMemoryError 期间,如果你抓住它,你将再次获得它,因为GC可能无法在第一时间释放内存。另一方面,可以正确捕获和处理异常。
  2. 错误本质上通常是致命的,并且从错误中恢复是不可能的,这在Exception的情况下是不同的,在所有情况下都不是致命的。 Java中错误与异常的区别
  3. 与错误不同,例外通常分为两类,例如选中和未选中的例外情况。 Checked Exception在Java编程语言中具有特殊的地位,并且需要一个强制性的try catch finally代码块来处理它。另一方面,Unchecked Exception是RuntimeException的子类,主要表示编程错误。最常见的未经检查的异常示例是Java中的NullPointerException。
  4. 与未经检查的异常类似,Java中的错误也未选中。如果编译器没有看到使用try catch或finally块处理的错误,则不会抛出编译时错误。事实上,处理错误不是一个好主意,因为从错误中恢复是不可能的。
  5. Java中的Error和Exception之间存在差异。要记住的关键点是错误本质上是致命的,并且可能无法进行恢复,另一方面,通过仔细处理异常,您可以使代码更加健壮并防范不同的场景。

    查看一些Error的子类,取自各自的javadoc:

      

    AnnotationFormatError - 注释解析器尝试时抛出   从类文件中读取注释并确定   注释格式不正确。

         

    AssertionError - 抛出以指示断言失败。

         

    LinkageError - LinkageError的子类表示类有   一些依赖于另一个类;然而,后一类有   在编写前一课后不一致地改变了。

         

    VirtualMachineError - 抛出以指示Java虚拟机   被破坏或已经耗尽了继续所需的资源   操作

答案 3 :(得分:3)

来自the Error documentation

  

错误是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。

the Exception documentation

  

类Exception及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件。

我认为这使得区别清晰。另请注意,两者都从throwable继承,因此都可以抛出。