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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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="";
}

4 个回复

正序浏览
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
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之前执行.

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2 鼓励鼓励

查看全部评分

回复 使用道具 举报
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;


评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你的另外一个问题我也看了。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"; 这样反向判断不就完了??????

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马