黑马程序员技术交流社区
标题:
有点小凌乱的结果,求解释...
[打印本页]
作者:
Tesla时光
时间:
2012-9-9 21:50
标题:
有点小凌乱的结果,求解释...
本帖最后由 翁发达 于 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,我就凌乱了.....
}
}
作者:
袁艳超
时间:
2012-9-9 22:03
你记录字符串用的output 是成员变量,那么当执行完foo(0),output就已经被赋值为134啦,执行foo(1),只不过是把"23"和前面的"134"两个字符串相加了
作者:
吴通
时间:
2012-9-9 22:20
楼主:
首先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)的结果就不再互相影响了
作者:
Tesla时光
时间:
2012-9-9 22:49
吴通 发表于 2012-9-9 22:20
楼主:
首先foo(0)的时候,先读try里面的语句,i !=1,所以执行output+="1",output变成" "+"1",
由于没有抛 ...
谢谢,问题解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2