首先,明确一点:finally 处理使用System.exit(0)强制关闭线程不会执行外,都会执行。(当然,在try{}块之前出现了其他异常或错误不会执行此finally)
其次,如果try-catch或者catch-finally都有return,那么finally块中return语句会覆盖别处的return语句。这是因为方法内部的局部变量和对象的引用(注意这里,对象的数据在堆内存中,其引用在栈内存中)存储在栈中,只有这个方法结束后,对应的栈才被回收,此时在其方法体中的变量和引用将不存在。因此,在return返回时不是直接返回变量的值,而是复制一份,然后返回。如果返回是引用,如果在try{ return obj;}finally{obj.elment = xx;},finally中修改其引用指向的数据会改变(即,返回是修改后的对象的引用)。
public class Main {
int fun() {
int i = 10;
try {
--i; //i=9
i = i / 0; //try中后面的代码不会执行
return i--;//不会执行到这里,跳到catch
} catch(Exception e) {
System.out.println("catch1:" + i);//i == 9
--i;
System.out.println("catch2:" + i);//i == 8
return i--;// 这里返回的i为8, 然后i再-- ,即这里复制一份i==8作为返回值,由于是基本类型而不是引用类型,后面修改i的值,这里保存的返回值依然是8
} finally {
System.out.println("finnal1:" + i);// i==7;
--i;
System.out.println("finnal2:" + i);//i==6
return i--;//最终返回值为6
}
}
public static void main(String[] args){
System.out.println(new Main().fun());
}
}