当必须始终捕获异常时,Java 程序怎么会崩溃?

How can Java programs crash when exceptions must always be caught?

如果这是一个愚蠢的问题,请原谅我,但据我所知,必须捕获并处理所有 Java 异常。 例如,这样的事情会产生编译器错误:

public String foo(Object o) {
    if (o instanceof Boolean) {
        throw new Exception();
    }
    return o.toString();
}

因为方法 foo() 没有添加 throws 子句。
然而,这个例子是可行的(除非方法 foo() 没有 throws 子句或者方法 bar() 没有包含 foo()try/catch块):

public String foo(Object o) throws Exception {
    if (o instanceof Boolean) {
        throw new Exception();
    }
    return o.toString();
}

public void bar(Object o) {
    try {
        String s = foo(o);
    }
    catch (Exception e) {
        //...
    }
    //...
}

最后,有时 Java 程序有时仍会由于 未处理 异常而崩溃。

这是怎么发生的?

您不必处理所有 种异常。

java.lang.RuntimeException or java.lang.Error 继承的异常是所谓的 未经检查的异常 可以被 try-catch 构造捕获,但它们不一定是.

如您在 java.lang.Error 的 API 文档中所见,它并未继承自 java.lang.Exception。因此,它不会被您的 try-catch 块捕获 - 您只查找 java.lang.Exception 及其子类。

看看this article in the docs

有些异常可以取消检查,这些被称为运行时异常。例如,IllegalArumentException 是未经检查的异常,因为它是 java.lang.RuntimeException 的后代。你可以阅读它 here.