java中try、catch、finally语句块的执行顺序
初学到try、catch、finally时我所记得的时:三者的顺序try语句块先执行,执行过程中如果遇到异常则转入catch语句块,最后执行finally语句块的内容。在不牵扯到return语句时这很好记。在加入到return语句时就有很多要注意的情况。
1.try中有return,没有catch,finally中没有return。
public class Test {
public static void main(String[] args) {
Test m = new Test();
System.out.println("return i=" + m.amethod());
}
public int amethod() {
int i = 0;
try {
i++;
System.out.println("try i=" + i + " ");
return ++i;
} finally {
// 2.finally一定会在return之前执行。(准确说,应该是return;语句)
i++;
System.out.println("finally i=" + i + " ");
}
}
}
执行结果:
try i=1
finally i=3
return i=2
这里先执行了try语句,i的值变为1,
然后执行了return语句,++i,i的值变为2,将要返回的值2保存起来, 继续执行finally语句,
在finally开始时i的值为2,执行后变为3
函数执行结束,将临时保存的值2返回。
public static void main(String[] args) {
Test m = new Test();
System.out.println("return i=" + m.amethod1());
}
public int amethod1() {
int i = 0;
try {
// 1,抛出异常,i=1
i++;
int x = i / 0;
System.out.println("try return" + i + " ");
} catch (Exception ex) {
// 2.catch捕获异常,并执行
i++;
System.out.println("catch return " + i + " ");
//3.执行++i; i变为3
return ++i;
} finally {
// 4.finally一定会在return之前执行。(准确说,应该是return;语句)
i++;
System.out.println("finally return " + i + " ");
}
return 0;
}
执行结果:
catch return 2
finally return 4
return i=3
public int amethod3() {
return -1;
}
public int amethod2() {
int i = 0;
try {
// 1,抛出异常
i++;
int x = i / 0;
System.out.println("2try return" + i + " ");
} catch (Exception ex) {
// 2.catch捕获异常,并执行
i++;
System.out.println("2catch return " + i + " ");
//3.执行amethod1();,结果保存下来,等待finally执行完毕之后返回
return amethod1();
} finally {
// 4.finally一定会在return之前执行。(准确说,是函数执行完毕,将返回值返回)
i++;
System.out.println("2finally return " + i + " ");
//5.执行return i, i的值覆盖掉第三步保存下来的值并将i返回
return i;
}
}
执行结果:
2catch return 2
2finally return 3
return i=3
总结
在不产生异常的情况下,try语句块执行和catch语句块相似
执行顺序:
1.try/catch语句块(不包含return语句)
2.return语句(执行要返回的语句,得出返回值,并临时保存下来
3.执行final语句,如果没有return语句,执行完成后,函数返回之前保存的结果
如果有return语句,finally语句块的return值将覆盖之前保存的值并返回