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) {