try-catch-finally
try-catch-finally 的细解基本测试案例
第一、只要有finally,那么finally块中代码就会执行;这句话很重要
第二、如果try-catch中有return , finally也有return有如下两种情况(test03、test04):
- 修改基本类型不影响返回结果的。(传值的)
- 修改引用类型影响返回结果的。(传址的)
public class TestFinally {
public static void main(String[] args) {
TestFinally tf = new TestFinally();
System.out.println("-------------<1>------------");
try {
System.out.print(1);
}finally {
System.out.print(0);
}
System.out.println();
System.out.println("-------------<2>------------");
System.out.println(tf.test01());
System.out.println("-------------<3>------------");
System.out.println(tf.test02());
System.out.println("-------------<4>------------");
System.out.println(tf.test03());
System.out.println("-------------<5>------------");
System.out.println(tf.test04().age);
}
public int test01(){
try {
return 1;
}finally {
System.out.print(0);
}
}
public int test02(){
try {
return 2;
}finally {
return 3;// 只是为了验证finally,实际开发别这么写
}
}
public int test03(){
int t = 0;
try {
t = 4;
return t;//执行 finally 之前,JVM 会先将 t = 4 的结果暂存起来,然后 finally 执行完毕后,会返回之前暂存的结果,而不是 t = 5 ,可以自行编译了解细节
}finally {
t = 5;
}
}
public Cat test04(){
Cat cat = new Cat();
try {
cat.age =6;
return cat;//return在执行时,会复制了一个cat引用,指向Cat的实例,在finally改变了实例的age值后,cat仍然指向被改变的实例
}finally {
cat.age =7;
}
}
}
class Cat{
public int age;
}
输出结果如下:
-------------<1>------------
10
-------------<2>------------
01
-------------<3>------------
3
-------------<4>------------
4
-------------<5>------------
7