当前位置: 代码迷 >> J2SE >> JAVA底层代码求解,多谢
  详细解决方案

JAVA底层代码求解,多谢

热度:279   发布时间:2016-04-24 18:03:28.0
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) {
  相关解决方案