java - java中捕获的错误

标签 java exception

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

  1. 异常
  2. 错误

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

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

在评论之前,请执行代码片段,奇怪的是它有效并且执行了两个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");
    }
}

最佳答案

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

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

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

*引自本书:

One branch is headed by Exception. This class is used for exceptional conditions that user programs should catch. [...] The other branch is topped by Error, which defines exceptions that are not expected to be caught under normal circumstances by your program. [...] This chapter will not be dealing with exceptions of type Error, because these are typically created in response to catastrophic failures that cannot usually be handled by your program.

(粗体是我的。)

请注意,最后一句话是在谈论产生通常无法由程序处理的错误的条件,而不是创建和抛出的错误对象。当然,我可以捕捉到 StackOverflowErrorOutOfMemoryError,但我无法在真正解决这些问题的代码中做任何事情捕获了他们 - 我需要解决代码中的一些错误,以防止错误首先发生。

关于java - java中捕获的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18848214/

相关文章:

java - jsp 未在请求的 uri 上呈现

android - BluetoothSocket.connect() 抛出 IOException

python - 重新引发异常不适用于 "finally"子句

python:异常流程:捕获后继续向下捕获 block ?

java - spring mvc中上传下载xlsx文件

java - pdfbox 1.8.8 视觉签名

java - 在 Eclipse 中使用 Maven 设置 GWT 项目

c - 错误: expected ‘;’ before ‘printf’ C

.net - Control.EndInvoke 为异常重置调用堆栈

java 泛型 : bounded wildcard upsetting eclipse