黑马程序员技术交流社区

标题: 一段代码的解释 [打印本页]

作者: 祁振朋    时间: 2013-3-19 00:41
标题: 一段代码的解释
本帖最后由 祁振朋 于 2013-3-19 18:03 编辑

class Test
{
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);
}
}

求解释代码执行流程,1 ,foo(0)执行后,改变了output的值,会不会影响到foo(2)的执行。
                                   2,foo(2)执行的结果没有看懂。请大神指点一下是怎么执行的。
作者: 谭辉    时间: 2013-3-19 10:53
这个题在毕老师的视频里讲过,,要注意output是静态的,你问的应该是foo(1)怎么执行的吧,
执行完foo(0)后output的值是134,执行foo(1)的时候在try块里抛出异常,进入catch块,output 的值在原来的134后面加上2变成了1342,因为catch块有return语句应该跳出函数,但后面还有finally块,在跳出函数前还要执行finally中的语句,即再加上3变成13423,而后面 output+="4"; 不在finally块中因而不会执行.所以foo(1)执行后结果为13423
作者: 郑show    时间: 2013-3-19 11:56
执行完foo(0)后 output的值是134,
执行foo(1)的时候在try块里抛出异常,进入catch块,  output 的值在原来的134后面加上2变成了1342,
因为catch块有return语句 应该跳出函数,但后面还有finally块,在跳出函数前还要执行finally中的语句, 即再加上3变成13423,而后面 output+="4"; 不在finally块中因而不会执行.所以foo(1)执行后结果为13423

赞同楼上的解释!
作者: 袁术森    时间: 2013-3-19 12:16
会啊 因为foo(0)执行完过后 改变了静态字符串变量output在方法区中的值啊 ,而foo(1)执行时又要涉及到变量output,所以会影响啊
执行流程,foo(0),判断没有异常 所以程序正常执行 finally是必须执行代码块 所以 foo(0)执行完 output 就变为了134
在foo(1)时,output的初始值已经变为了134,这点主意就可以了,然后判断有异常,进行catch捕捉,output变为1342,catch代码块中的return语句是要结束程序,在此之前要把没有执行完的代码执行完,finally语句是在return结束之前 必须执行的 所以 结果为13423,finally代码块一执行完,return结束程序 。
作者: 陈丽莉    时间: 2013-3-19 14:41
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~




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