A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangzhiyong515 中级黑马   /  2014-5-12 15:05  /  1575 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  public static void main(String[] args) {
                System.out.println(getInt());
        }
        private static int getInt() {
                int x = 10;
                try {
                        x = 20;
                        System.out.println(x / 0);
                        x = 30;
                } catch (ArithmeticException e) {
                        x = 40;
                        return x;                 } finally {
                        x = 50;
                }
                return x;
        }

6 个回复

倒序浏览
是40吗?
回复 使用道具 举报
这涉及到try...catch语句的执行顺序问题了
try{
//1:抛出异常的代码
//2:代码
}catch(){
//3:代码
//4:抛出异常
}finally{
//5:代码
}
//6:代码
首先finally语句,是不管try是否抛出异常,finally语句块都会执行
其次,这个语句执行顺序会有几种情况:
第一种大的情况:try语句块没有抛出异常,则程序会执行try,finally以及finally块之后的代码;
第二种大的情况:try语句块抛出了异常并且catch有匹配的异常。当遇到try里面抛出的异常后,try块里面剩下的代码就不执行了,跳转到catch块里面。
这里又可以分为2种情况。第一种,抛出的异常被后面的catch捕获,而catch又没有抛出新的异常,那么执行顺序是1,3,5,6 ;第二种,如果catch里面又抛出新的异常,顺序是1,3,4,5,然后将新的异常返回给方法调用者,6就不执行了 ;
第三种打的情况:try语句块抛出了异常,但是后面的catch没有能匹配的异常。那么会执行try和finally里面的语句也就是1,5,然后将该异常返回给方法调用者,不执行6 。

这就是一些try...catch语句的一些情况。再来分析楼主的代码。

  1. System.out.println(x / 0);
复制代码

这一句将会产生异常,所以后面的x=30就不会被执行了。
这个异常被catch捕获,并重新赋值x=40,这就相当于捕获异常并且抛出了一个异常,并且返回,所以finally代码块之后的语句不会被执行,这
接下来将执行finally代码块,虽然重新赋值了,但并没有返回x的值。
所以结果应该是40.
不知道这么说楼主明白吗?


回复 使用道具 举报
第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:
1.return语句只在函数最后出现一次。
2.return语句仅在try和catch里面都出现。
3.return语句仅在try和函数的最后都出现。
4.return语句仅在catch和函数的最后都出现。
注意,除此之外的其他做法都是不可行的,编译器会报错。

(1)如果程序运行到try成功时可以返回结果,则采用方法2。
(2)如果程序运行到catch时(即中途出错时)无需再继续执行后面的代码了,则采取方法4;
(3)如果程序运行到try或catch时还需要继续执行后面的代码,则采取方法1
回复 使用道具 举报
本帖最后由 大恶魔先森~ 于 2014-5-12 17:52 编辑

结果为40.
  1. public static void main(String[] args)
  2. {
  3.       System.out.println(getInt());
  4. }
  5.         private static int getInt()
  6.        {
  7.                 int x = 10;//位置1
  8.                 try
  9.                 {
  10.                       x = 20;//位置2
  11.                       System.out.println(x / 0);//位置3
  12.                       x = 30;// 位置4
  13.                 }
  14.               catch (ArithmeticException e)                    
  15.               {
  16.                      x = 40;//位置5
  17.                      return x; //位置6                        
  18.                        
  19.                 }
  20.                
  21.         
  22.         finally
  23.         {
  24.             s=50;//位置7
  25.         }
  26.      }
复制代码

1,首先初始化执行位置1,将10赋值给x,x==10;
2,然后执行try中位置2,x==20;接着执行输出语句,遇到异常,直接跳过位置4.
3,跳过位置4执行cath语句,在一次改变了x的值,x==40,并用return语句将结果返回给了主函数,但是程序还没运行完,但是结果已经知道x==40;
4,执行finally位置7中的语句,但是结果已经返给了主函数。所以赋值无效,程序停止。无论如何,finally语句是一定会执行。还有一点件事要记住:在try,catch,finally中含有return的执行情况:1.无论try里面有没有return语句,finally语句一定都会执好。
2.如果finally中没有return语句,try里面有return,那么在执行try中的return语句之前会先去执行finally中的代码,再去执行try中的return语句;如果在finally中也包含return语句,将会直接返回,不再去执行try中的return语句。
回复 使用道具 举报
:lol细心点就好了。
回复 使用道具 举报
结果是40,当你执行除0操作后,代码会发生异常,你进行了catch 所以程序会跳转到 catch语句中,x=30就不会执行,
在catch 中 x=40 被赋值后,执行了return语句,这时候外部调用此函数的对象就会获得return 回来的x值
也就是40
至于x=50 虽然有这个赋值动作,但只是内部操作了,和调用此函数的对象无关
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马