黑马程序员技术交流社区

标题: 这个程序的执行结果为什么又是13423?? [打印本页]

作者: 我自信我很牛    时间: 2013-4-4 11:02
标题: 这个程序的执行结果为什么又是13423??
class Test1
{
//public String output="";
public C c=new C();

public static void main(String args[])
{
  Test1 t=new Test1();
  //foo(0);
  System.out.println(t.foo(0).msg);//134
  //foo(1);
  System.out.println(t.foo(1).msg); //13423
}
public C foo(int i)
{
  try
  {
   if(i==1)
    throw new Exception();  
   c.msg+="1";
  }
  catch(Exception e)
  {
   c.msg+="2";
  
   return c; //在内存中开避空间用为存储当前output值
  }
  finally
  {
   c.msg+="3";
   //System.out.println("output="+c.msg);
  }
  c.msg+="4";
  return c;
}
}

class C
{
String msg="";
}

作者: 随便    时间: 2013-4-4 11:13
你的另外一个问题我也看了。http://bbs.itheima.com/thread-44099-1-1.html
这个程序的执行结果怎么是8 求解释 。
是吧。
你一定是学了异常处理,然后就开始滥用异常。
if(i==1)
    throw new Exception();  
   c.msg+="1";

像这种代码都抛出异常,那不知道要抛出多少异常。
if(i!=1) c.msg+="1"; 这样反向判断不就完了??????
作者: 杜超    时间: 2013-4-4 12:15
t.foo(0).msg运行过程:
因为i=0,执行c.msg+="1";这时没有发生异常,跳过catch,运行finally, c.msg+="3";最后执行 c.msg+="4";
所以结果为134;

t.foo(1).msg运行过程:这时i=1,执行if(i==1)throw new Exception();,  c.msg+="1"; 这个没有执行,异常抛出,
执行catch语句,c.msg+="2",因为有return c; , c.msg+="4"; 就不执行了,但finally是必须执行的, c.msg+="3"; 会运行。
因为t.foo(0).msg 已经运行过,所以在t.foo(1).msg 运行时,接着上次的运算结果继续运算。
所以结果是13423,而不是23;



作者: 日三省    时间: 2013-4-4 13:38
msg是字符串类型.. +表示连接.

t.foo(0).msg运行过程:
因为i=0,false 不执行语句,没有异常抛出. 执行下一句 c.msg+="1";
finally 中的语句必须执行的.   执行c.msg+="3";
再顺序执行下一句     c.msg+="4";
最后   return c;
输出134

t.foo(1).msg运行过程:这时i=1,执行throw new Exception();                  异常抛出,
跳转 执行 catch语句,c.msg+="2",      
下一句虽然是 return c;  但是finally是必须执行的,所以先执行 finally中的语句  c.msg+="3";
再回去执行 return c;
方法结束
由于之前msg的值是134    后面继续连接上23
就是13423
输出 12323

这题虽然刚没看懂..倒腾了半天..通了
总结:
不论    语句位置   位置如何.
finally会在  return之前执行.
作者: 黄玉昆    时间: 2013-4-4 17:04
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




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