Gag*_*n93 1 java exception-handling
Throwable位于异常层次结构的顶部,它的两个直接子类是:
ExceptionError根据最着名的编程书籍(Herbert Schildt,完整的参考文献),可以捕获和处理异常,但是"ERROR类型的异常"无法捕获和处理,因为它们是由于我们无法摆脱的一些问题!
但是这段代码正常工作.不知道如何或为什么.
在评论之前,请执行代码片段,奇怪的是它可以工作并且两个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");
}
}
Run Code Online (Sandbox Code Playgroud)
它不可能,它不应该*.当程序应该恢复的预期错误情况(认为打印机缺纸,网络连接丢失等)时,检查异常被设计为抛出.未经检查的异常和错误被设计为在出现错误或发生某些不可恢复的情况(内存不足,堆栈溢出等)时抛出,因此您不想吞下这些条件,您想要处理的问题是引起他们,所以他们不会发生在一开始.
偶尔会有一些时候捕获一个未经检查的异常(某些子类RuntimeException)是必要的(例如,NumberFormatException当试图解析一个用户输入的整数时捕获一个) - 但几乎从来没有时间捕获错误是好的.
正如您所发现的那样,技术方面没有任何东西可以阻止您捕获错误,就像捕获异常一样 - 如果您愿意,甚至可以捕获堆栈溢出和内存不足错误.只是在几乎所有情况下这都是一个坏主意!
*引用本书:
一个分支由Exception领导.此类用于用户程序应捕获的异常条件.[...]另一个分支以错误为首,它定义了程序在正常情况下不会被捕获的异常.[...]本章不会处理Error类型的异常,因为这些异常通常是为了响应程序通常无法处理的灾难性故障而创建的.
(博尔丁是我的.)
请注意,最后一句话是讨论创建通常不能由程序处理的错误的条件,而不是创建和抛出的错误对象.当然,我可以捕获一个StackOverflowError或一个OutOfMemoryError,但我无法在代码中做任何事情,一旦我抓住它们就真正解决了这些问题 - 我需要解决代码中的一些错误,以防止错误首先发生.