黑马程序员技术交流社区

标题: 各位亲!求下面程序的运行结果,并希望给出解析过程 [打印本页]

作者: 一梦千寻    时间: 2013-12-19 22:17
标题: 各位亲!求下面程序的运行结果,并希望给出解析过程
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
作者: 嘿马    时间: 2013-12-20 08:08
您好。对于异常处理中,finally是必须执行的语句,
foo(0)方法,output+="1";结果就变为了"1";然后就执行finally, output+="3",结果就变为了13,;再执行下面的 output+="4",结果就变为了134;
对于后面的foo(1),我也只能和方面一样分析,分析不到正确结果,希望后面的同学或是版主补充,谢谢了!
作者: 嘿马    时间: 2013-12-20 08:18
嘿马 发表于 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结束!
作者: lichao    时间: 2013-12-20 10:05
我加了注释,希望对你有帮助
  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. }
复制代码





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