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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test1 {
        public static String output="";
        public static void foo(int i)
        {
                try
                {
                        if(i==1)
                                throw new Exception();
                        output+="1";
                }
                catch(Exception e)
                {
                        output+="2";
                        return;
                }
                finally
                {
                        output+="3";
                }
                output+="4";
        }

       
        public static void main(String[] args) {
                foo(0);
                System.out.println(output);
                foo(1);
                System.out.println(output);
               

        }

}        // 求积分:P

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

3 个回复

倒序浏览
您好。对于异常处理中,finally是必须执行的语句,
foo(0)方法,output+="1";结果就变为了"1";然后就执行finally, output+="3",结果就变为了13,;再执行下面的 output+="4",结果就变为了134;
对于后面的foo(1),我也只能和方面一样分析,分析不到正确结果,希望后面的同学或是版主补充,谢谢了!
回复 使用道具 举报
嘿马 发表于 2013-12-20 08:08
您好。对于异常处理中,finally是必须执行的语句,
foo(0)方法,output+="1";结果就变为了"1";然后就执行fin ...

知道后面的怎么想了!因为foo(0)后output变为了134,然后foo(1),if(i==1); throw new Exception()进入抓异常,output+="2",这时的结果为1342,然后进入finally,因为finally是必须要执行的,所以 output+="3";,所以这时的结果为13423,然后return结束!
回复 使用道具 举报
我加了注释,希望对你有帮助
  1. public class Test1 {
  2.     public static String output="";//此处将变量定义成静态的成员变量,那么在后面的语句中如果不对变量清空的话,执行output+="1"这样类似的语句,那么变量将一直累加下去,所以在main函数中执行foo(0)以后变量内的之会保留,在执行foo(1)时,输的变量开头会与foo(0)执行完输出的变量一样
  3.     public static void foo(int i)
  4.     {
  5.             try
  6.             {
  7.                     if(i==1)
  8.                             throw new Exception();//如果这里抛出异常则下面的output+="1"代码将不会执行,而执行catch代码块;如果没有抛出异常,则执行output+="1"代码而不执行catch代码块;
  9.                     output+="1";
  10.             }
  11.             catch(Exception e)
  12.             {
  13.                     output+="2";//如果执行catch代码块,那么就不会执行output+="4"代码,因为return 代码会结束此函数,但是finally代码块一定会被执行,也就是在函数结束前执行;如果没有执行catch代码块,那么程序会先执行finally代码块在执行output+="4"语句,因为try...catch...finally是一个整体。
  14.                     return; //函数结束语句
  15.             }
  16.             finally//一定会被执行的代码块。如果在try..catch语句中有结束,那么系统也会先调用该代码块后在结束;
  17.             {
  18.                     output+="3";
  19.             }
  20.             output+="4";//;如果前面执行结束语句,那么就不会执行此代码,如果没有执行结束语句那么就会顺序的执行此代码
  21.     }

  22.    
  23.     public static void main(String[] args) {
  24.             foo(0);
  25.             System.out.println(output);
  26.             System.out.println("--------------------------------------------");
  27.             foo(1);
  28.             System.out.println(output);
  29.             

  30.     }

  31. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马