[code="java"] public static void main(String[] args) {
String n=null;
try{
n=a();
}catch(Exception e){
System.out.println(1);
}
System.out.println(n);
}
private static String a() {
try{
throw new Exception();
}finally{
return "aa";
}
}[/code]
整体都很是不解
[b]运行结果是打印aa[/b],
如果深究的话理由在Java语言规范第三版的14.20.2节和14.21节,通俗点说就是:break,continue,return,throw语句都代表某个代码快没有正常运行结束,上面的a()方法中try中因为有throw语句,代表没有正常结束,此时如果finally语句能正常结束则能抛出异常,但是finally也有代表不正常结束的return语句,此时异常被忽略和丢弃;所以结果只有aa字符串打印处理,不管怎样finally代码块从能运行;
其实这跟我们经常说的"覆盖值"有点类似,看下面代码:
[code="java"]
private static String a() {
try{
return "bb";
}finally{
return "aa";
}
}
[/code]
该方法还是返回aa,因为aa把bb给覆盖了
希望对你有所帮助
面试题?挺有意思,
a方法抛出了异常并且返回了aa
main方法捕捉了a方法抛出的异常
a()方法起了两个作用:
1.返回字符串 "aa" ——finally模块必执行;
2.抛出一个Exception。
main进程在try模块里调用a()方法给n赋值,并且捕获到a()方法抛出的异常,进入catch模块,打印,最后打印n。
估计这就是个异常练习或demo什么的。
我运行了下结果,楼上说得都不对阿 呵呵~~
厄。。。
LZ是不是想问1为什么没打印出来
在main方法中调用a()方法,a方法中抛出一个异常,finally里面的语句还是照样执行,再回到main方法里看,a方法抛出异常了,main里面就要捕捉异常(即执行 System.out.println(1);),然后再打印a的返回值。
try {
throw new Exception();
} finally {
return "aa";
}
try throw new Exception();,但是throw new Exception();这句本身没有发生异常,所以1没有被打出来,至于它抛出的异常,没有被catch到,丢弃了。。
[quote]
我运行了下结果,楼上说得都不对阿 呵呵~~
hudingchen (中级程序员) 2011-05-13
[/quote]
哦,原来就是要说明在try模块里抛出的异常不会向外传递啊,之前还没注意,一般我都是在catch模块里抛异常的,没仔细想,不好意思…… :oops:
运行结果是aa吧?
a()方法中,只是返回了“aa”,异常并没有抛出吧,a()方法定义上都没有throws Exception的定义,如果a()方法内真的抛出异常的话,那就是编译错误,因此在main方法中也不会捕捉到异常,更不会打印出“1”了
应该打印aa的:
首先看下a方法,谨记finally段总是执行,也是说a方法中的throw new Exception()实际上还没来得及抛出,就已经因为finally模块中的return "aa"语句而退出a方法了。所以在main方法中也不会捕捉到异常。
n=a()="aa".
main线程中的try{}catch{}语句是多余的,a()的异常是不会抛出的
finally的return把try中的动作覆盖了,所以异常也捕获不到了。