java - 最后抛出异常并捕获 block

标签 java exception try-catch-finally rethrow

对 catch 和 finally block 中抛出的异常有疑问:

class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print(1);
            q();
        }
        catch (Exception i) {
            throw new MyExc2();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }
    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
            System.out.print(3);
        }
        finally {
            System.out.print(4);
            throw new Exception();
        }
    }

}

我曾多次尝试执行上述代码。它每次都会给我不同的输出。

output 1: 1Exception in thread "main" 342test.MyExc1
at test.C1.main(C1.java:18)
output 2: 1342Exception in thread "main" test.MyExc1
at test.C1.main(C1.java:18)
output 3: 1Exception in thread "main" test.MyExc1
342 at test.C1.main(C1.java:18)
output4:  1Exception in thread "main" 34test.MyExc1
2 at test.C1.main(C1.java:18)

请解释。

最佳答案

您所看到的只是写入 System.outSystem.err 之间的竞争条件。您明确调用 System.out.print 1,然后是 3,然后是 4,然后是 2,异常被抛出并自动转储到 System.err。所以你得到的每个输出都是“1342”,其中某处有异常堆栈跟踪。

实际执行流程在每种情况下都是相同的 - 只是不同的输出。为了证明这一点,您可以将整个 main 方法包装在 try/catch block 中,该 block 将异常写入 System.out,此时它将与所有现有的 System.out 调用同步,并且不会出现竞争条件。

关于java - 最后抛出异常并捕获 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41160801/

相关文章:

java - 嵌套 for 循环。为什么内部变量值会重置?

java - Libgdx 与 Java Swing 问题

Java Applet CPU 限制?

c# - 帮助处理finally block 中的异常

java - 有没有办法在java中捕获不同逻辑的相同两个异常?

c# - 即使有 while 循环,Try/catch 函数也仅运行一次 C#

c#-4.0 - 为什么我的 "finally"不运行?

java - 如何为 MapFactory 指定比较器

Python 尝试除了最后

java - 优雅地退出应用程序?