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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tesla时光 中级黑马   /  2012-9-9 21:50  /  1268 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁发达 于 2012-9-9 22:49 编辑

麻烦谁能帮我解释下这下面的结果.
class Test1
{
public static String output="";
public static void foo(int i)
{
  try
  {
   if(i==1)//foo(1),//这里执行,结果是直接到catch
    throw new Exception();
   output+="1";
  }
  catch(Exception e)
  {
   output+="2";  这句执行后是2
   return;
  }
  finally
  {
   output+="3";//这段也执行了,成23,那不就结束了吗?结果不是23吗?
  }
  output+="4";
}
public static void main(String args[])
{
  foo(0);
System.out.println(output);这个结果我明白,
  foo(1);
  System.out.println(output);可这个运行出来13423,我就凌乱了.....
}
}

3 个回复

倒序浏览
你记录字符串用的output 是成员变量,那么当执行完foo(0),output就已经被赋值为134啦,执行foo(1),只不过是把"23"和前面的"134"两个字符串相加了
回复 使用道具 举报
楼主:
首先foo(0)的时候,先读try里面的语句,i !=1,所以执行output+="1",output变成" "+"1",
由于没有抛出异常,所以执行finally语句output+="3",output变成" "+"1"+"3"
按照顺序执行到output+="4"; 则output变成" "+"1"+"3"++"4"
所以foo(0)结果为134
之所以楼主对foo(1)不理解是因为楼主没有注意output前面的修饰符static
由于output被static修饰,所以output属于静态数据,也即共享数据
执行foo(0)的时候output=" "+"1"+"3"++"4",所以执行foo(1)的时候
output的初始值就为" "+"1"+"3"++"4",再进行运算,如果通过改动去掉前面
的static修饰,那么结果就不一样了
class Test1
{
public static void foo(int i)
{
  String output="";
    try
    {
     if(i==1)//foo(1),//这里执行,结果是直接到catch
   throw new Exception();
     output+="1";
    }
    catch(Exception e)
    {
     output+="2";  //这句执行后是2
     return;
    }
    finally
    {
     output+="3";//这段也执行了,成23,那不就结束了吗?结果不是23吗?
    }
    output+="4";
   System.out.println(output);
}
public static void main(String args[])
{
    foo(0);
    foo(1);
}
}
代码改为这个时,foo(0)和foo(1)的结果就不再互相影响了


回复 使用道具 举报
吴通 发表于 2012-9-9 22:20
楼主:
首先foo(0)的时候,先读try里面的语句,i !=1,所以执行output+="1",output变成" "+"1",
由于没有抛 ...

谢谢,问题解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马