在java中捕获错误

时间:2013-09-17 11:07:34

标签: java exception-handling

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

  1. Exception
  2. Error
  3. 根据最着名的编程书籍(Herbert Schildt,完整的参考资料),Exception 可以被捕获和处理,但是“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");
        }
    }
    

2 个答案:

答案 0 :(得分:6)

不是不能,它的不应该 *。当程序应该恢复的预期错误情况(认为打印机缺纸,网络连接丢失等)时,检查异常被设计为抛出。未经检查的异常和错误被设计为在出现错误或发生某些不可恢复的情况(内存不足,堆栈溢出等)时抛出,因此您不想吞下这些条件,您想要处理的问题是引起他们,所以他们不会在第一时间发生。

偶尔会有一些时候捕获未经检查的异常(子类RuntimeException)是必要的(例如在尝试解析用户输入的整数时捕获NumberFormatException) - 但几乎从来没有时间抓住错误很好。

正如您所发现的那样,技术方面没有任何东西可以阻止您捕获错误,就像捕获异常一样 - 如果您愿意,甚至可以捕获堆栈溢出和内存不足错误。只是在几乎所有情况下这都是一个坏主意!

*从书中引用:

  

一个分支以异常为首。这个班   用于捕获的用户程序的特殊条件。 [...]另一个分支以错误为首,它定义了不期望的异常   在你的程序正常情况下被抓住。 [...]本章不涉及   类型为Error的异常,因为这些异常通常是为了应对灾难性故障而创建的   通常不能由您的程序处理。

(Bolding是我的。)

注意最后一句话是讨论创建错误的条件,这些错误通常不能由程序处理,而不是创建和抛出的错误对象。当然,我可以捕获StackOverflowErrorOutOfMemoryError,但我无法在代码中执行任何,一旦我抓住它们就真正解决了这些问题 - 我需要解决代码中的一些错误,以防止错误首先发生。

答案 1 :(得分:1)

ExceptionError都可以被捕获 但是你无法在Error之后恢复,也就是没有用它来捕捉它。所以我们不应该抓住Error

  

例如在OutOfMemoryError期间,如果你抓住它,你将再次获得它,因为GC可能无法在第一时间释放内存。

但您可以从Exception恢复。

  

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

相关问题