黑马程序员技术交流社区
标题:
异常疑惑,求分析打印结果?
[打印本页]
作者:
黑马17期-闫东东
时间:
2013-3-15 22:45
标题:
异常疑惑,求分析打印结果?
本帖最后由 黑马17期-闫东东 于 2013-3-17 00:03 编辑
class Test4
{
//public String output="";
public C c=new C();
public C foo(int i)
{
try
{
if(i==1)
throw new Exception();
c.msg+="1"; //throw 定义了语句编译也通过了?不是编译不通过吗?
}
catch(Exception e)
{
c.msg+="2";
return c; //在内存中开避空间用为存储当前output值
}
finally
{
c.msg+="3";
//System.out.println("output="+c.msg);
}
c.msg+="4";
return c;
}
public static void main(String args[])
{
Test4 t=new Test4();
System.out.println(t.foo(1).msg); //23
}
}
class C
{
String msg="";
}
打印:23
为什么不是 234??
作者:
黑马-郑玉元
时间:
2013-3-15 22:59
首先i==1,抛出异常,再执行catch里面的内容,msg=2;然后执行return,又有finally,最后执行finally,执行c.msg+="3",所以打印的结果就是23了!
作者:
丁一
时间:
2013-3-15 23:00
应该是catch 里面执行了return , 所以直接返回了,没有执行c.msg+="4"; 而finally是必须执行的,应该是这样吧?
作者:
王智威
时间:
2013-3-15 23:03
在if(i==1)
throw new Exception();
已经跑出异常了,函数已经终止了就不会接下去走了,就只会运行 catch(Exception e)和 finally中的代码。
即使你的代码catch了
。
作者:
孙宁
时间:
2013-3-15 23:08
i==1,符合条件抛出异常,catch捕获异常,运行c.msg+="2",得到c.msg="2",按一般情况应该是返回c的,但是后面finally是必须要执行的,运行 c.msg+="3"后再返回c,所以得到23
作者:
杨剑
时间:
2013-3-15 23:35
在这里
if(i==1)
throw new Exception();
c.msg+="1"; //throw 定义了语句编译也通过了?不是编译不通过吗?
因为throw语句前面有个if判断语句,所以c.msg+="1";这句话在if为假的情况下可以执行的到,所以编译通过。
在打印语句中t.foo(1)执行的是try块中的语句,等于1抛出了一个异常c.msg+="1"没有执行到。这个异常被
捕获后执行c.msg+="2",并返回c,程序结束,由于finally中语句始终会执行,所以c.msg+="3"也会执行,
下面的代码将不再执行,所以msg的值是23
作者:
itserious
时间:
2013-3-15 23:39
class Test4 {
// public String output="";
public C c = new C();
public C foo(int i) {
try {
if (i == 1)
throw new Exception();
c.msg += "1"; // throw 定义了语句编译也通过了?不是编译不通过吗?
// 上面能通过 他一个省略语句,省略了一对大括号:try {if (i == 1){throw new Exception();}c.msg += "1";}
} catch (Exception e) {
c.msg += "2";
return c; // 在内存中开避空间用为存储当前output值
} finally {
c.msg += "3"; //这里运行完了,就会去运行
上面的 return c,
然后退出返回,
下面的 c.msg += "4"; return c; 不会执行了,
//所以结果是:23
}
c.msg += "4";
return c;
}
public static void main(String args[]) {
Test4 t = new Test4();
System.out.println(t.foo(1).msg); // 23
}
}
class C {
String msg = "";
}
作者:
安鹏宇
时间:
2013-3-16 01:38
try
{
if(i==1)
throw new Exception();
c.msg+="1"; //throw 定义了语句编译也通过了?不是编译不通过吗?
}
catch(Exception e)
{
c.msg+="2";
return c;
//这段代码,try throw catch
听老师讲的比较有意思,如果你直接写throw 直接抛的话,你还要在调用你的地方进行捕获或者继续抛
但是这段代码是 你在这里抛出异常,catch直接捕获,也就是自己抛异常自己捕获异常,throw抛出
catch捕获直接自己处理 运行catch里的代码 所以打印了 “2”
finally是不管你前边结果怎样都运行,除非碰到System.exit(0); 执行完再执行return
所以,打印 23
这种写法我们实际开发用的不多,在笔试题里比较常见。
作者:
HM张超
时间:
2013-3-16 09:45
进入catch 打印2 然后他执行return,但是程序有finally,所以finally里的也会执行并return,外面代码将不会再执行,如果没有异常的话
就是134
作者:
黑马17期-闫东东
时间:
2013-3-16 23:44
这个题考异常流程,
原题是:
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);//134
foo(1);
System.out.println(output); //13423
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2