检验大家的finally学的程度的一段代码,你能全部答对吗?

first ao 2013-04-25 05:31:04
大家看看会输出什么吧
我是第一个就错了,才写了第二个方法娱乐一下

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);
}
}

...全文
708 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
吃我咸鱼一棒 2013-05-26
  • 打赏
  • 举报
回复
finally是在try中return后执行的。
光明矢 2013-05-26
  • 打赏
  • 举报
回复

try{
   x=1;
   return x;
}catch(){
   x=2;
   return x;
}finally{
   x=3;
// return x;
}
若finally块里面有return,则会覆盖try块里面的return。若没有,当然是按try块的return返回值。 finally块应该是释放资源之类的作用。
sbpcx0208 2013-05-24
  • 打赏
  • 举报
回复
我先马克,明天再看。
zsw101259 2013-05-24
  • 打赏
  • 举报
回复
sca4441479 2013-05-23
  • 打赏
  • 举报
回复
楼主这个StringBuffer出题出的不错,虽然方法是在finally之前返回“”了,但是末了又追加了一个3.
first ao 2013-05-20
  • 打赏
  • 举报
回复
引用 13 楼 kiritor 的回复:
[quote=引用 12 楼 wangbiao17 的回复:] [quote=引用 11 楼 qq548573025 的回复:] [quote=引用 3 楼 wangbiao17 的回复:] 答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递[/quote] String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?[/quote] 怎么会有这种想法呢?java中就只有传值而已(地址同样是个值) 兄台所说的传地址是指的是传引用吗? 不要在java语言中讨论传引用的问题! java中根本就没有传引用这个概念! "传引用"就我现在知道的来说就只要C++吧[/quote] 不好意思,误人子弟了,的确java中的确是没有地址传递的,全是值传递。只是参数传递分为基本数据类型传递和引用数据类型传递。基本数据类型很明显就是基本数据类型(int、char等)及其封装类(Integer、Character等),以及其他一些final修饰的类,如String因为他们的值是不会变的。引用数据类型,就是所有自定义的类,作为参数,传递的是它的地址,地址是不会改变的,但是可以改变改地址指向实例里的值。不知道这样说能不能够说清楚
  • 打赏
  • 举报
回复
新手先mark一下 试了一下第一个输出语句,结果是1。。有些疑惑 return前会调用finaaly,先把1赋值给x,再把3赋值给x,覆盖掉原来的1 然后将x = 3返回。。。。这是我原本的了解,但结果却不是这样的 好心人能否整个内存图或者大白话的给解析解析么 哥们好纠结
yeshucheng 2013-05-04
  • 打赏
  • 举报
回复
这个题目重点考察的确是:
zhoujinglong 2013-05-04
  • 打赏
  • 举报
回复
引用 22 楼 u010289977 的回复:
新手先mark一下 试了一下第一个输出语句,结果是1。。有些疑惑 return前会调用finaaly,先把1赋值给x,再把3赋值给x,覆盖掉原来的1 然后将x = 3返回。。。。这是我原本的了解,但结果却不是这样的 好心人能否整个内存图或者大白话的给解析解析么 哥们好纠结
首先java是传值的。 try 里的return 是先于finally执行的,执行到return时x==1 ,return x; 相当于return 1; 然后去执行finally 里的x = 3;这个时候和return 已经没有什么关系了。 第2题,传进来的是一个对象的引用,你可以这么想, JVM操作的是入参的一个副本,而不是入参那个变量本身,x 就相当于x1的副本,它俩指向同一个对像,所以通过x 可以修改对象里面的值,但是改变x 的指向对x1 是没有影响的。
zhaogang 2013-04-30
  • 打赏
  • 举报
回复
测了一下,结果:1,1,3
朗晴 2013-04-30
  • 打赏
  • 举报
回复
执行finally
zhaogang 2013-04-30
  • 打赏
  • 举报
回复
3 "" 4
三儿样 2013-04-30
  • 打赏
  • 举报
回复
我是这样理解的,首先finaaly 不管怎么样都会执行,而是在catch 块后,return 前执行,方法返回的不是值,而是地址的引用,同意楼上解释方法inc() ,而方法2也是这样,在因为在进入finally语句块之前,会有一个暂时保存的过程,执行完finally后再返回地址的引用,如StingBuffer x = new StringBuffer; 传如的x 时,也是传的x的地址的引用,x.append(“a”);其s地址中的值会增加a, x = new StringBuffer(); 这时x的指向变了为新的一个地址,而finally块中把这个地址值放了3,然后又重新换了指向,而返回值的指针地址,已经被放到一边了,这时再 x = new StringBuffer("4");改变它的指向,已经和返回值无关了。
王大叔爱编程 2013-04-30
  • 打赏
  • 举报
回复
引用 13 楼 kiritor 的回复:
[quote=引用 12 楼 wangbiao17 的回复:] [quote=引用 11 楼 qq548573025 的回复:] [quote=引用 3 楼 wangbiao17 的回复:] 答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递[/quote] String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?[/quote] 怎么会有这种想法呢?java中就只有传值而已(地址同样是个值) 兄台所说的传地址是指的是传引用吗? 不要在java语言中讨论传引用的问题! java中根本就没有传引用这个概念! "传引用"就我现在知道的来说就只要C++吧[/quote] 嗯,那能不能这样理解呢,在java中,基本数据类型的参数,属于传值,而对于引用数据类型传的是在堆里么开辟的空间地址。麻烦赐教一下··
LCore 2013-04-28
  • 打赏
  • 举报
回复
引用 5 楼 wangbiao17 的回复:
[quote=引用 4 楼 kiritor 的回复:] [quote=引用 3 楼 wangbiao17 的回复:] 答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
这种问题,只要想明白修改的是什么就ok了 修改的是内存地址,还是地址里面的内容[/quote] X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer(); 这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。[/quote] x,x1同一块内存区域, 之后x重新指向另一块区域,x1又没有变啊
王大叔爱编程 2013-04-28
  • 打赏
  • 举报
回复
引用 4 楼 kiritor 的回复:
[quote=引用 3 楼 wangbiao17 的回复:] 答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
这种问题,只要想明白修改的是什么就ok了 修改的是内存地址,还是地址里面的内容[/quote] X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer(); 这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
LCore 2013-04-28
  • 打赏
  • 举报
回复
引用 3 楼 wangbiao17 的回复:
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
这种问题,只要想明白修改的是什么就ok了 修改的是内存地址,还是地址里面的内容
王大叔爱编程 2013-04-28
  • 打赏
  • 举报
回复
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
shine333 2013-04-28
  • 打赏
  • 举报
回复
至于什么传值传引用,记住一点,Java的编程思维不是这个样子的,不要把你想要改变的对象传给谁,而是 1 让他自己发生变化,或者 2 让掌控他的人自己替换 3 第三者不要插足
shine333 2013-04-28
  • 打赏
  • 举报
回复
唯一的难点在于,return 和finally的关系 执行到 return expression的时候, 1 运行expression求值,将其结果放到寄存器中 2 跳到finally处,执行finally里面的代码 3 返回步骤1中存入寄存器的结果 因此,无论步骤2中的finally对步骤1中expression的结果有多大的影响,都已经无济于事了
加载更多回复(10)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧