Java Try catch finally执行顺序似乎是随机的

Java Try catch finally执行顺序似乎是随机的,java,exception,exception-handling,Java,Exception,Exception Handling,我试图理解try-catch-finally执行流是如何工作的。对于堆栈溢出用户的执行流,有几种解决方案 其中一个例子是: 代码A将被执行。如果一切顺利(即A执行时没有抛出异常),最后将转到,,因此将执行代码C。如果在执行A时引发异常,那么它将转到B,最后转到C 但是,我在尝试时得到了不同的执行流: try { int a=4; int b=0; int c=a/b; } catch (Exception ex) { ex.printStackTrace(); }

我试图理解
try-catch-finally
执行流是如何工作的。对于堆栈溢出用户的执行流,有几种解决方案

其中一个例子是:

代码A将被执行。如果一切顺利(即A执行时没有抛出异常),最后将转到
,因此将执行代码C。如果在执行A时引发异常,那么它将转到B,最后转到C

但是,我在尝试时得到了不同的执行流:

try {
    int a=4;
    int b=0;
    int c=a/b;
}
catch (Exception ex)
{
    ex.printStackTrace();
}
finally {
    System.out.println("common");
}
我得到两种不同的输出:

第一次输出:

java.lang.ArithmeticException: / by zero
at substrings.main(substrings.java:15)
lication.AppMain.main(AppMain.java:140)
common
 common
    java.lang.ArithmeticException: / by zero
    at substrings.main(substrings.java:15)
但是,当我第二次运行相同的程序时:

第二次输出:

java.lang.ArithmeticException: / by zero
at substrings.main(substrings.java:15)
lication.AppMain.main(AppMain.java:140)
common
 common
    java.lang.ArithmeticException: / by zero
    at substrings.main(substrings.java:15)
我应该从中得出什么结论?它是随机的吗?

printStackTrace()
输出为标准错误<代码>系统.out.println(“公共”)
输出到标准输出。它们都被路由到同一个控制台,但它们在该控制台上的显示顺序不一定是执行顺序


如果您在catch块和finally块中写入相同的流(例如,尝试
System.err.println(“common”)
),您将看到捕获异常时,catch块总是在finally块之前执行。

异常的
printstacktrace()
方法源代码(在
Throwable
类中定义)

发生输出格式化是因为您正在通过
System.out.println
使用标准输出流,并且出现异常
System.err

尝试使用一个变量,该变量将检查异常,并在异常发生时在同一错误控制台中打印:-

boolean isException = false;
try {
        int a=4;
        int b=0;
        int c=a/b;
    }
    catch (Exception ex)
    {
       isException = true
       ex.printStackTrace();
    }
    finally {
       if(isException){
        System.err.println("common");
       }else{
        System.out.println("common");
       }
  }

结果是什么,但不应该是随机的。交叉检查。不同的系统流会产生格式不正确的输出。是否尝试附加调试器并单步执行代码?