异常链如何在我的代码中工作?

How does exception chain work in my code?

为什么此代码不打印 "d"。为什么它不转到 RunTimeException 的 catch 块?

public static void main(String[] args) {
    System.out.println("a");
    try {
        System.out.println("b");
        throw new IllegalArgumentException();
    } catch (IllegalArgumentException e) {
        System.out.println("c");
        throw new RuntimeException();
    }catch (RuntimeException e) {
        System.out.println("d");
        throw new RuntimeException();
    }finally{
        System.out.println("e");
        throw new RuntimeException();
    }
}

这个程序的输出是

a
b
c
e
Exception in thread "main" java.lang.RuntimeException

编辑:抛出 IllegalArgumentException 后,它会转到相应的 catch 块并打印 'c'。在那之后,因为我们没有在 RuntimeException 中捕获异常,所以它不会再继续了。但是因为它保证我们去 finally 块它打印 'e' 然后抛出 RunttimeException。如果代码如下所示,它会抛出 RuntimeException("2")。如果我们最后在里面注释异常,它会抛出RuntimeException("1")。

public static void main(String[] args) throws InterruptedException {
            System.out.println("a");
            try {
                System.out.println("b");
                throw new IllegalArgumentException();
            } catch (IllegalArgumentException e) {

                    System.out.println("c");
                    throw new RuntimeException("1");

            }catch (RuntimeException e) {
                System.out.println("d");
                throw new RuntimeException();
            }finally{
                System.out.println("e");
                throw new RuntimeException("2");
            }
        }

catch 块不在 try 的范围内。 catch 块中的任何代码都在外部 main 代码的上下文中执行,因此没有异常处理程序。当你抛出 RuntimeException 时,try 的 finally 块被执行,然后异常终止程序。

这段代码不打印 d 的原因是,因为在 IllegalArgumentException 捕获块中,在打印 "c" 之后和抛出 RuntimeException 之前它最终执行(这就是流程的工作方式)。最后块自己抛出异常,所以它永远不会抛出将它带到 "d".

的 RuntimeException
public static void main(String[] args) {
System.out.println("a");
try {
    System.out.println("b"); // 1
    throw new IllegalArgumentException(); // 2
} catch (IllegalArgumentException e) {
    System.out.println("c"); // 3
    throw new RuntimeException(); // nope, there's a finally block that executes first
}catch (RuntimeException e) {
    System.out.println("d");
    throw new RuntimeException();
}finally{
    System.out.println("e"); // 4
    throw new RuntimeException(); // 5 - rest of the code never got executed.
}

}

希望这已经足够清楚了。

另外,正如所指出的,即使在"c"之后的RuntimeException被执行,它也不会调用下层的catch块。 catch 块仅被调用一次,具体取决于 try 块中抛出的异常(尽管这并不真正相关,因为第一个解释决定了线程的流程)。

在 try catch 块中,如果其中一个 catch 块捕获了异常,则其他 catch 不参与。请记住,无论是否抛出异常,最后总是 运行 阻塞。