读书人

查验大家的finally学的程度的一段代码

发布时间: 2013-07-01 12:33:04 作者: rapoo

检验大家的finally学的程度的一段代码,你能全部答对吗?
本帖最后由 qq548573025 于 2013-04-25 17:36:25 编辑 大家看看会输出什么吧
我是第一个就错了,才写了第二个方法娱乐一下


package test;

public class Test {

public int inc() {
int x;
try {
x = 1;
return x;
} catch (Exception e) {
x = 2;
return x;
} finally {
x = 3;
}
}

public StringBuffer inc(StringBuffer x) {
try {
x.append("1");
x = new StringBuffer();
return x;
} catch (Exception e) {
x.append("2");
return x;
} finally {
x.append("3");
x = new StringBuffer("4");
}
}

public static void main(String[] args) {
int x = new Test().inc();
System.out.println(x);
StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
System.out.println(x1);
System.out.println(x2);
}
}

异常 参数 Java
[解决办法]
引用:
本帖最后由 qq548573025 于 2013-04-25 17:36:25 编辑
大家看看会输出什么吧
我是第一个就错了,才写了第二个方法娱乐一下
Java code?123456789101112131415161718192021222324252627282930313233343536373839package test; ……

目测是
1
1
3

[解决办法]
System.out.println(x);//输出1,因为方法返回的是1,虽然finally会被执行
StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);

//输出1,传递的是一个对象的“复本”修改的是对象指向的内容
System.out.println(x1);
//输出3,finally怎样都会执行,因为其修改了地址里面的内容
System.out.println(x2);
[解决办法]
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢


[解决办法]
引用:
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢

这种问题,只要想明白修改的是什么就ok了
修改的是内存地址,还是地址里面的内容
------解决方案--------------------


引用:
Quote: 引用:

答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢

这种问题,只要想明白修改的是什么就ok了
修改的是内存地址,还是地址里面的内容


X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢

这种问题,只要想明白修改的是什么就ok了
修改的是内存地址,还是地址里面的内容


X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。

x,x1同一块内存区域,
之后x重新指向另一块区域,x1又没有变啊
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢

这种问题,只要想明白修改的是什么就ok了
修改的是内存地址,还是地址里面的内容


X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。


ok,明白。谢啦哈哈
[解决办法]
一句话 finally 总是会在return之前执行
[解决办法]
引用:
一句话 finally 总是会在return之前执行

是finally在try模块中return之后运行!先把try或catch所以的代码运行完才会运行finally中代码
[解决办法]
1、int x = new Test().inc();
调用inc()方法,定义int x,在try对x赋值为1,然后return x!虽然finally中对x重新赋值,但是此时对inc()返回值没有影响!所以返回1
其中需要注意的两点时:x值已经改变,只是先return了,再改变x的值而已,所以只是对方法的返回值没有影响而已!
假如在finally中也有return,那么此时返回的值为3.

2、StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
调用inc(x1)方法,在try中相当于x1.append("1");
此时x1 = new StringBuffer(); 相当于x1 指向新的内存地址可以看做为:x1 = xx2 = new StringBuffer()
然后 return xx2;
在finally中xx2.append("3");xx2 = xxx3 = new StringBuffer("4");

所以new Test().inc(x1)返回的引用地址是xx2,指向的内存空间是xx2.append("3")
x1的地址没变,指向的内存空间是x1.append("1");

只要弄清楚了,哪些是对引用的修改,哪些是对内存空间的修改就很容易弄明白了!

[解决办法]
引用:
Quote: 引用:

答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.


但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢



第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递


String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
[解决办法]

首先java是传值的。
try 里的return 是先于finally执行的,执行到return时x==1 ,return x; 相当于return 1;
然后去执行finally 里的x = 3;这个时候和return 已经没有什么关系了。

第2题,传进来的是一个对象的引用,你可以这么想,
JVM操作的是入参的一个副本,而不是入参那个变量本身,x 就相当于x1的副本,它俩指向同一个对像,所以通过x 可以修改对象里面的值,但是改变x 的指向对x1 是没有影响的。

读书人网 >J2SE开发

热点推荐