日期:2014-05-20  浏览次数:20766 次

JAVA底层代码求解,谢谢
Java code

public class test_try {
    

    

    public int doPrint(){
        int a = 0;
        try{
            a=1;
            throw new SQLException();
        }
        catch(Exception e){
            System.out.println("catch_开始");
            return a;
            
        }
        finally{
            System.out.println("finally_开始"+a);
            a=3;
            System.out.println("finally_完毕"+a);
        }
    }
    public static void main(String[] args) {
        test_try t=new test_try();
        System.out.println("得到返回的值"+t.doPrint());
    }

}


得到的结果是:
  catch_开始
  finally_开始1
  finally_完毕3
  得到返回的值1

一般情况下是先执行TRY里面的语句 ,当遇到异常后则执行catch里面的代码,然后再执行finally
那么:结果不是这样的显示方式,应该是return返回2后 然后再回来执行finally ,但是这种方式也不可取,

很显然根据显示的结果是这样的执行了try 遇到异常执行catch 里面的System.out.println("catch_开始");

然后缓存起return a;(这里的a当然是1了)

然后执行finally 里面的了~~

最后返回 catch里面执行return a;

然后输出a  
 

这里问题就来了。为什么要这样做???

请高手解释下 谢谢

------解决方案--------------------
个人认为楼主的疑问牵涉到两点:
1、java中的变量问题:
java中基本类型都是传值,还有一个特殊的对象String对象是不变量,也可以理解为传值吧
public int doPrint() 这个方法的返回值如果是 基本类型或者是 String类型,起返回结果都是在Catch内确定了,因为finally内
的修改都是另一个内存区域内的值

public Object doPrint() 如果是对象那么java中是传引用,所以finally做的修改跟catch内做的修改是同一块内存中的数据,这个时候finally内修改就会起作用,如果是返回对象的话,就是楼主理解的那样了

2、finally 块内语句 除断电,jvm崩溃,或者System.exit() 不会执行到,其他情况都会先执行finally块内的语句,最后执行return语句


下面是我的测试代码:
public class Fuck {

/**
* 测试StringBuffer对象

* @return
*/
public static StringBuffer printSB() {
StringBuffer a = new StringBuffer();
try {
a.append("try");
System.out.println("try_开始" + a);
throw new Exception();
} catch (Exception e) {
a.append("catch");
System.out.println("catch_开始" + a);

return a;

} finally {
a.append("finally");
System.out.println("finally_开始" + a);
}
}

/**
* 测试用户对象

* @return
*/
public static Stu printObj() {
Stu stu = new Stu(25, "ffshi");
try {
stu.setName("try");
System.out.println("try_开始 " + stu.toString());
throw new Exception();
} catch (Exception e) {

stu.setName("catch");
System.out.println("catch_开始 " + stu.toString());
return stu;

} finally {
stu.setName("finally");
System.out.println("finally_开始 " + stu.toString());

}
}

public static void main(String[] args) {
System.out.println(printSB());

// try_开始try
// catch_开始trycatch
// finally_开始trycatchfinally
// trycatchfinally
System.out.println(printObj().toString());
// try_开始 age:25 name:try
// catch_开始 age:25 name:catch
// finally_开始 age:25 name:finally
// age:25 name:finally
}

}

class Stu {
@Override
public String toString() {
// TODO Auto-generated method stub
return "age:" + age + " name:" + name;
}

int age;
String name;

public Stu(int age, String name) {
this.age = age;
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {