1. 下面的代码return之后,fianlly还会执行吗?
public class Demo {
public static void main(String[] args) {
haha();
}
public static void haha(){
try{
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("4");
return;
}catch(Exception e){
}finally {
System.out.println("锄禾日当午,汗滴禾下土");
}
}
}
首先要明确一点:fianlly是 必然执行的异常统一处理出口,无论是否发生异常, finally必然执行。 所以会打印 "锄禾日当午,汗滴禾下土。"
接下来一个案例比较难理解。
2. 返回的年龄age是多少?
public class Demo6 {
public static void main(String[] args) {
Person p = haha();
System.out.println(p.age);
}
public static Person haha(){
Person p = new Person();
try{
p.age = 18;
return p;
}catch(Exception e){
return null;
}finally {
p.age = 28;
}
}
static class Person{//静态内部类
int age;
}
}
结果是28,后面用内存图来解释。
p.age = 18;
将p对象中的age赋值为18,但是在执行return之前,要先执行finally里面的代码,所以age又被赋值为28。
3. a的值是多少
public class Demo7 {
public static void main(String[] args) {
int a = test();
System.out.println(a);
}
public static int test(){
int a = 10;
try{
return a;
}catch(Exception e){
}finally {
a = 20;
}
return 0;
}
}
先说答案,a还是10。和上面一道题的区别在于,一个是引用数据类型,一个是非引用数据类型。
画图分析
return a;
备份了一份返回值a=10,虽然后面对a重新赋值为20,但是最终结果还是10。可能不太好理解,两个例子结合起来看。
return p;
返回了对象p中的内存地址,备份的也是p的内存地址,虽然也对这个内存地址备份了,但是后面的代码改的是内存地址中的内容,所以最后的结果也会改变。