1

Throwable 位于异常层次结构的顶部,它的两个直接子类是:

  1. Exception
  2. Error

根据最著名的编程书籍(Herbert Schildt,The complete reference),异常可以被捕获和处理,但 ERROR 类型的 `Exception 不能被捕获和处理,因为它们是由于一些我们无法摆脱的问题造成的!

但是这段代码正常工作。不知道如何或为什么。

在评论之前,请执行代码片段,奇怪的是它可以工作并且两个 println 语句都被执行

class ExceptionTest {
    public static void main(String...args) {
        try {
            throw new StackOverflowError();
        } catch(Error e) {
            System.out.println("caught and processed " + e);
        }
        System.out.println("finished");
    }
}
4

2 回答 2

6

它不是不能,它不应该*. 已检查的异常旨在在程序应从预期的错误条件中恢复时抛出(认为打印机缺纸、网络连接断开等)。未经检查的异常和错误旨在在出现错误或发生某些不可恢复的情况(内存不足、堆栈溢出等)时抛出,因此您不想吞下这些情况,您想处理以下问题导致它们,因此它们一开始就不会发生。

有时有时需要捕获未经检查的异常(子类的东西RuntimeException)(例如,在尝试解析用户输入的整数时捕获 a NumberFormatException) - 但几乎从来没有时候捕获错误是好的。

正如您所发现的,在技术方面没有什么可以阻止您以与捕获异常相同的方式捕获错误 - 如果您愿意,您甚至可以捕获堆栈溢出和内存不足错误。只是在几乎所有情况下,这都是一个坏主意!

*引用书中的内容:

一个分支由 Exception 领导。此类用于用户程序捕获的异常情况。[...] 另一个分支的顶部是 Error,它定义了在正常情况下不会被您的程序捕获的异常。[...] 本章不会处理 Error 类型的异常,因为这些异常通常是为了响应您的程序通常无法处理的灾难性故障而创建的。

(加粗是我的。)

请注意,最后一句话是在讨论导致程序通常无法处理的错误的条件,而不是创建和抛出的错误对象。当然,我可以捕捉 aStackOverflowError或 an ,但是一旦我捕捉到这些问题OutOfMemoryError,我就无法在代码中做任何真正解决这些问题的事情——我需要解决代码中的一些错误,以防止错误发生在首位。

于 2013-09-17T11:09:18.330 回答
1

Exception两者Error都可以被抓住。
但是之后就不能恢复了Error,那就是抓也没用。所以我们不应该抓Error

例如在 OutOfMemoryError 期间,如果您捕获它,您将再次得到它,因为 GC 可能无法首先释放内存。

但你可以从Exception.

例如,如果指定的文件不可用,则会发生 FileNotFoundException,然后您捕获它,您可以提供任何其他文件并继续程序。

于 2013-09-17T11:10:32.507 回答