若有finally语句,则无论如何,都会执行该语句,在try或catch中的return语句会将它的返回值压入栈内,然后执行finally语句,当finally执行完成后,若finally语句里有return语句,则执行return语句并结束。若finally没有return语句,则返回被保存的栈里的return语句并结束。然而,在压栈时候,要注意压入栈内的是什么东西,是值本身还是引用,若是引用则引用的值会改变,若是变量值,则不会改变。
public class TestFinal {
public static void main(String[] args) {
System.out.println("test1:"+testFinal1());
System.out.println("test2:"+testFinal2());
System.out.println("test3:"+testFinal3());
System.out.println("test4:"+testFinal4());
}
static int testFinal1(){
int i = 1;
try{
return i; //将其压入栈,执行finally,压入栈内是变量值,i 不会改变
}
finally{
System.out.println("in testFinal1():finally 肯定会被执行的!");
i = 48;
}
}
static String testFinal2(){
String str = "try";
try{
return str; //将其压入栈,执行finally,压入栈内是变量值,str 不会改变
}
finally{
System.out.println("in testFinal2():finally 肯定会被执行的!");
str = "finally";
}
}
static StringBuilder testFinal3(){
StringBuilder build = new StringBuilder("try ");
try{
return build; //将其压入栈,执行finally,压入栈内是引用,build值改变
}
finally{
System.out.println("in testFinal3():finally 肯定会被执行的!");
build.append("finally"); //改变了对象的值
build = new StringBuilder("你猜我是谁!"); //另一个对象
}
}
static String testFinal4(){
try{
return "return in try";
}
finally{
System.out.println("in testFinal4():finally 肯定会被执行的!");
return "return in finally"; //若fianlly中有ruturn,直接返回
}
}
}
输出是:
in testFinal1():finally 肯定会被执行的!
test1:1
in testFinal2():finally 肯定会被执行的!
test2:try
in testFinal3():finally 肯定会被执行的!
test3:try finally
in testFinal4():finally 肯定会被执行的!
test4:return in finally