黑马程序员技术交流社区

标题: 分享一段有趣的代码,昨天课堂上基本全挂了,看看你知道不 [打印本页]

作者: 塞肥肥塞牙人    时间: 2014-9-3 11:11
标题: 分享一段有趣的代码,昨天课堂上基本全挂了,看看你知道不
请问X=?
public static int getNum() {
                int x = 10;
                try {
                        System.out.println(1/0);
                        return x;
                } catch (Exception e) {
                        x = 20;
                        return x;                                                       
                }finally {                                                               
                                                                                       
                        x = 30;
                        return x;
                }
        }
作者: 柳超    时间: 2014-9-3 11:14
。。。。 20
作者: zhxu188    时间: 2014-9-3 11:20
30.。。。。
作者: 塞肥肥塞牙人    时间: 2014-9-3 11:35
好吧,说说为什么不,认真看一下,挺容易中招的
作者: liaohongjie    时间: 2014-9-3 11:36
应该等于30
作者: 塞肥肥塞牙人    时间: 2014-9-3 12:02
liaohongjie 发表于 2014-9-3 11:36
应该等于30

不是30呢,在看看哈,很多人都中招了呢
作者: bullfrog    时间: 2014-9-3 12:10
不是30吗?我编译运行了一下,好像是30啊?
作者: fantacyleo    时间: 2014-9-3 13:03
运行过了,就是30。貌似不少人明白了,楼主还中着招呢;P

关键在于2点:
1. 异常处理是当try块中的代码出现异常后,程序跳转到专门的异常处理代码处继续执行的过程。异常处理完毕后,程序不会再回到出现异常的代码,而是执行位于try-catch-finally后的代码(当然,也可能不执行,比如在catch、finally中return了)。所以不要把太多与异常无关却又希望在异常处理后可能被执行的代码放到try块中
1. 因为finally一定会被执行到,所以本题最后x是30,并在finally中被返回
作者: 我要淡定。    时间: 2014-9-3 13:17
30吧,应该是
作者: 粺¹³¼畅    时间: 2014-9-3 13:22
30,啊,抛出异常后程序捕获异常,不处理异常,finally一定会被执行到。
作者: 王凯路路    时间: 2014-9-3 13:39
楼主,给你小改了一下, 你猜猜是多少 ?
public static int getNum() {
        int x = 10;
        try {
                return x;
        } catch (Exception e) {
                x = 20;
                return x;                                                        
        }finally {                                                               
                                                                                
                x = 30;
                return x;
        }
作者: 隔夜修书    时间: 2014-9-3 14:14
应该是30吧
作者: 安茹黑马    时间: 2014-9-3 14:23
估计楼主的题目是:请问X=?
public static int getNum() {
                 int x = 10;
                 try {
                         System.out.println(1/0);
                         return x;
                 } catch (Exception e) {
                         x = 20;
                         return x;                                                        
                 }finally {                                                               
                                                                                         
                         x = 30;
                              }
         }

这样结果才是20
作者: 碎流    时间: 2014-9-3 14:32
10               
作者: 塞肥肥塞牙人    时间: 2014-9-3 14:58
安茹黑马 发表于 2014-9-3 14:23
估计楼主的题目是:请问X=?
public static int getNum() {
                 int x = 10;

你这个是我想发的,没注意,不好意思啊,各位
作者: 安茹黑马    时间: 2014-9-3 15:14
之前有个帖子讨论过,大意是如果finally里对变量值进行改变,如果是基本数据类型,则值不变,如果是引用数据类型,值会改变,而本文finally里的变量是基本数据类型,所以值不变
作者: Sakuratossi    时间: 2014-9-3 15:38
结果是30啊
作者: Java黑马    时间: 2014-9-4 09:28
是不是20?
作者: Java黑马    时间: 2014-9-4 09:33
如果finally{}中没有return就是20了,finally会在catch(){}中的return前执行,有reutrn直接就结束了
作者: 谢建平    时间: 2014-9-4 10:12
  这类没验证还真不敢说出答案 0.0
作者: chen_32768    时间: 2014-9-4 16:05
30finally是必须要运行的,不论前面是否有异常抛出
作者: liaohongjie    时间: 2014-9-4 17:45
塞肥肥塞牙人 发表于 2014-9-3 12:02
不是30呢,在看看哈,很多人都中招了呢

确实我错了,应该是20才对,不能在finally中进行重新赋值
作者: Fightin黑马    时间: 2014-9-4 21:43
本帖最后由 Fightin黑马 于 2014-9-4 21:52 编辑

这个结果是30 ,不过原题应该是下面这样的,没有finally里面的return语句,下面结果是20public static int getNum() {
        int x = 10;
        try {
                int a=1/0;
                return x;
        } catch (Exception e) {
                x = 20;
                return x;                                                        
        }finally {                                                               

                x = 30;
             }


作者: sunny~    时间: 2014-9-4 21:49
try {
                         System.out.println(1/0);
}这里面是1除以0?
作者: sunny~    时间: 2014-9-4 21:52
奥  我知道了耶
作者: 许愿じ☆VE杰    时间: 2014-9-4 22:46
学习了~
作者: 双皮奶    时间: 2014-9-4 23:34
20吧,如果catch中有return ,finally中的代码是在catch中间部分执行的
作者: 戏言丶    时间: 2014-9-4 23:49
我是来学习的
作者: 莫忘本心    时间: 2014-9-4 23:57
应该是30吧  
作者: 烟海    时间: 2014-9-5 01:26
fantacyleo 发表于 2014-9-3 13:03
运行过了,就是30。貌似不少人明白了,楼主还中着招呢

关键在于2点:

这个try catch finally 的执行顺序是怎么样的?

不是执行try之后,遇到报错,执行catch去捕获吗?接着才会执行finally的吧 ?不是这个流程吗?如果是这个流程,在catch中,应该return了啊。。。
还是因为finally一定会执行到,所以不管前面有没有return??
作者: yl82846094    时间: 2014-9-5 06:28
看看!!!!
作者: 杜工    时间: 2014-9-5 06:49
这种题目和string有点像。int x=10,string s="10",一旦声明,就一直在常量池中存在,new一个对象并赋值才会改变。
作者: 范鹏霄    时间: 2014-9-5 07:13
30,因为finally是一定执行的
作者: 卖艺人    时间: 2014-9-5 09:31
30.finally 必须执行到,除非catch块中有System.exit()方法终止程序的运行
作者: 风轻扬    时间: 2014-9-5 10:19
正确命案是:30
作者: F@C    时间: 2014-9-5 16:15
进来学习
作者: liaorubei    时间: 2014-9-6 08:54
在异常处理中,finally块里面的代码会无论如何都会执行的,里面有给X赋值30的操作,所以X最后为30
作者: 怀念黑海岸    时间: 2014-9-6 12:27
   其实这道题没有那么迷惑的,只需记住:除非调用exit方法,否则finally最终都会被执行,所以finally中的代码会在所有的return之前被执行,而执行finally中的代码时因为存在return语句,所以就返回finally中的x值了。30
作者: glbai    时间: 2014-9-6 18:46
也学习一下
作者: 哈达洋    时间: 2014-9-6 21:02
不是30么?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2