在Java中,finally
块中的代码会在以下几种情况下执行:
-
正常退出:当
try
块中的代码正常执行完毕,没有发生任何异常时,finally
块中的代码会在try
块之后立即执行。 -
异常发生:即使
try
块中抛出了异常,finally
块中的代码也会执行。这包括在try
块或catch
块中发生的异常。 -
异常被捕获:如果
catch
块捕获了异常,finally
块会在catch
块执行完毕后执行。 -
return语句:如果在
try
块或catch
块中执行了return
语句,finally
块仍然会执行,但会在return
之前执行。 -
抛出异常:如果
finally
块中抛出了异常,这个异常会被抛出,但如果try
块或catch
块中已经抛出了异常,那么finally
块中的异常会被忽略,而try
块或catch
块中的异常会被传递出去。 -
System.exit()调用:如果在
try
块或catch
块中调用了System.exit()
方法,finally
块中的代码不会执行,因为程序已经终止。 -
死亡循环:如果
try
块或catch
块中的代码进入了一个无限循环,而没有外部干预,finally
块中的代码将不会执行。 -
线程死亡:如果当前执行的线程在
try
块或catch
块中因为某些原因死亡,而没有进入到finally
块,那么finally
块中的代码也不会执行。 -
虚拟机崩溃:如果Java虚拟机(JVM)崩溃,那么任何
finally
块中的代码都不会执行。
下面是一个简单的示例,展示了finally
块的执行情况:
public class FinallyBlockExample {
public static void main(String[] args) {
try {
System.out.println("Try block executing.");
throw new Exception("Exception in try block");
} catch (Exception e) {
System.out.println("Catch block executing.");
} finally {
System.out.println("Finally block executing.");
}
}
}
在这个例子中,无论是否发生异常,finally
块中的代码都会执行。程序的输出将是:
Try block executing.
Catch block executing.
Finally block executing.
这表明即使在try
块中抛出了异常,并且catch
块捕获了异常,finally
块仍然会执行。