gpt4 book ai didi

java - 为什么finally block 执行与未捕获的异常不一致

转载 作者:行者123 更新时间:2023-12-01 10:48:25 26 4
gpt4 key购买 nike

我最近在一次采访中被问到关于java中异常情况的执行顺序,如果异常没有被捕获并传播回调用代码,有finally block ,那么是否会打印finally block 语句?如果是的话,它们是在异常之前还是之后打印的?

我尝试运行此场景,发现输出不一致。

我尝试过的代码是:

公共(public)类FinallyExecution{

public static void main(String[] args) {

try{

FinallyExecution.divide(100, 0);

}finally{
System.out.println("finally in main");
}

}

public static void divide(int n, int div){

try{
int ans = n/div;
}
finally{
System.out.println("finally of divide");
}
}

}

不一致的输出是:

一次:

Exception in thread "main" java.lang.ArithmeticException: / by zero
at exceptions.FinallyExecution.divide(FinallyExecution.java:20)
at exceptions.FinallyExecution.main(FinallyExecution.java:9)
finally of divide
finally in main

下一个:

finally of divide
finally in main
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exceptions.FinallyExecution.divide(FinallyExecution.java:20)
at exceptions.FinallyExecution.main(FinallyExecution.java:9)

那么在这种情况下到底发生了什么?JVM 是执行finally block 然后异常退出,还是按照相反的顺序?无论哪种情况,为什么输出不一致?

最佳答案

您正在打印到System.out,而未捕获的异常堆栈跟踪则打印到System.err。您可以在控制台中看到这两个内容,但未定义顺序。

如果您将调试打印更改为使用 System.err,则顺序是一致的。

关于java - 为什么finally block 执行与未捕获的异常不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34050332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com