我们有Throwable
类,它是Error
类(用于不可恢复的错误)和Exception
类(用于可恢复的错误)的基类
所以,
1>我们可以 throw
实现类的对象error
。(虽然实现类没有意义,Error
因为我们有Exception
类来做同样的事情..)
2> Java 不推荐捕获Error
对象..
那么Error
对象的需求是什么呢?编译器不能在内部实现吗?这不是一个错误吗?
我们有Throwable
类,它是Error
类(用于不可恢复的错误)和Exception
类(用于可恢复的错误)的基类
所以,
1>我们可以 throw
实现类的对象error
。(虽然实现类没有意义,Error
因为我们有Exception
类来做同样的事情..)
2> Java 不推荐捕获Error
对象..
那么Error
对象的需求是什么呢?编译器不能在内部实现吗?这不是一个错误吗?
从技术上讲,“不可恢复的错误”和“可恢复的错误”之间并没有真正的区别,而是已检查的异常和未检查的异常之间的区别。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)也会对你大喊大叫。
您当然可以抛出扩展(而不是实现)Error
类的对象。
正如你所说,Error
存在不可恢复的错误。最广泛的用途是在 JVM 本身中,它使用 的子类来Error
处理它无法恢复并且不希望您能够从中恢复的东西 - 例如内存不足。
错误的 javadoc 说
Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。
而对于异常,javadoc 说
类 Exception 及其子类是 Throwable 的一种形式,它指示合理的应用程序可能想要捕获的条件。
一些差异
这就是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.