今天, 读到一段源码,对finally的执行顺序产生了一点疑惑, 源码如下:
在test方法中, finally是何时执行的呢?
执行结果是: 在"begin"之后, "end"之前, 执行了10次"finally " + i .
这与我之前对finally的执行顺序有很大差别, 在之前我一直认为finally语句块是方法中最后执行的. 但是对test方法来说, 以前的那种理解明显是一个悖论, 是不成立的.
接下来, 我编写了如下两段代码
在观察了这两段代码的执行结果与最初的test方法的执行结果十分类似, finally语句块都是在"begin"和"end"之间执行的.
由此我得出另一个对finally语句块执行顺序的结论:"[size=large][color=red][b]finally语句块是在该finally语句块上一层语句块的最末执行的[/b][/color][/size]".
test 方法中finally语句块的上一层语句块是for语句块;
test1 方法中finally语句块的上一层语句块是if语句块;
test2 方法中finally语句块的上一层语句块由{}构成的;
特记载于此.
public static void test() {
System.out.println("begin");
for( int i = 0; i < 10; i ++ ) {
try{
System.out.println("test " + i);
}finally{
System.out.println("finally " + i );
}
}
System.out.println("end");
}
在test方法中, finally是何时执行的呢?
执行结果是: 在"begin"之后, "end"之前, 执行了10次"finally " + i .
这与我之前对finally的执行顺序有很大差别, 在之前我一直认为finally语句块是方法中最后执行的. 但是对test方法来说, 以前的那种理解明显是一个悖论, 是不成立的.
接下来, 我编写了如下两段代码
public static void test1 () {
System.out.println("begin");
if(true){
try{
System.out.println("try " + "test1");
}finally{
System.out.println("finally " + "test1 ");
}
}
System.out.println("end");
}
public static void test2 () {
System.out.println("begin");
{
try{
System.out.println("try " + "test1");
}finally{
System.out.println("finally " + "test1 ");
}
}
System.out.println("end");
}
在观察了这两段代码的执行结果与最初的test方法的执行结果十分类似, finally语句块都是在"begin"和"end"之间执行的.
由此我得出另一个对finally语句块执行顺序的结论:"[size=large][color=red][b]finally语句块是在该finally语句块上一层语句块的最末执行的[/b][/color][/size]".
test 方法中finally语句块的上一层语句块是for语句块;
test1 方法中finally语句块的上一层语句块是if语句块;
test2 方法中finally语句块的上一层语句块由{}构成的;
特记载于此.