4

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

所以,

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

2> Java 不推荐捕获Error对象..


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

4

4 回答 4

8

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

  • 必须throws在你的子句中声明一个检查异常;如果使用在块中引发检查异常的方法,则try必须catch说异常或将此异常添加到方法的throws子句中;
  • 可以throws在子句中声明未经检查的异常(不推荐);try如果使用在块中引发未经检查的异常的方法,则可以 catch将该异常或将此异常添加到方法的throws子句中(也不推荐)。

除非您真的知道自己在做什么,否则当然不建议您“吞下”任何类型的未经检查的异常(即,catch它带有一个空块)。

Exception是基础检查异常类;Error并且RuntimeException都是未经检查的异常,它们的所有子类也是如此。您会注意到所有三个类都 extend Throwable,并且 javadoc forThrowable声明:

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

(in) 著名的未检查异常的经典示例:

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

Error和之间唯一真正的区别RuntimeException是它们估计的严重性级别,并且是“语义”差异,而不是技术差异:最终,两者的行为相同。Error如果你抓住一个但不重新抛出它,一些 IDE(想到 Intellij IDEA)也会对你大喊大叫。

于 2013-01-07T13:42:47.307 回答
7

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

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

于 2013-01-07T13:20:38.650 回答
5

错误的 javadoc 说

Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。

而对于异常,javadoc 说

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

一些差异

  1. 错误并不意味着被捕获,即使您捕获它也无法从中恢复。例如在OutOfMemoryError期间,如果你抓住它,你会再次得到它,因为 GC 可能无法首先释放内存。另一方面,可以正确捕获和处理异常。
  2. 错误在本质上通常是致命的,从错误中恢复是不可能的,这在异常情况下是不同的,在所有情况下可能不是致命的。Java中错误和异常的区别
  3. 与Error 不同,Exception 通常分为两类,例如checked 和unchecked Exceptions。Checked Exception 在 Java 编程语言中具有特殊的地位,需要强制 try catch finally 代码块来处理它。另一方面,作为 RuntimeException 的子类的 Unchecked Exception 主要代表编程错误。未经检查的异常最常见的示例是 Java 中的 NullPointerException。
  4. 与未检查的异常类似,Java 中的错误也是未检查的。如果编译器没有看到使用 try catch 或 finally 块处理的错误,则编译器不会抛出编译时错误。事实上,处理错误不是一个好主意,因为从错误中恢复几乎是不可能的。

这就是Java中错误和异常之间的区别。要记住的关键点是错误本质上是致命的,并且可能无法恢复,另一方面,通过仔细处理异常,您可以使您的代码更加健壮并防范不同的情况。

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

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

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

LinkageError - LinkageError 的子类表明一个类对另一个类有一些依赖;但是,后一个类在前一个类编译后发生了不兼容的变化。

VirtualMachineError - Thrown to indicate that the Java Virtual Machine is broken or has run out of resources necessary for it to continue operating.

于 2013-01-07T13:46:11.717 回答
3

错误文档

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

异常文档

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

我认为这清楚地表明了区别。另请注意,两者都继承自 throwable,因此都可以被抛出。

于 2013-01-07T13:22:00.710 回答