黑马程序员技术交流社区
标题:
关于try...finally的疑问
[打印本页]
作者:
java陈辉
时间:
2014-1-15 22:07
标题:
关于try...finally的疑问
下面这段代码执行的结果为什么是"bb"、"dd"、"cc",而不是"bb"、"cc"、"dd"呢?求解释。
public class Demo7_Exception {
public static void main(String[] args) {
Test t=new Test();
System.out.println(t.print());
}
}
class Test {
public String print() {
try {
System.out.println(1/0);
return "aa";
} catch (RuntimeException e) {
System.out.println("bb");
return "cc";
}finally {
System.out.println("dd");
}
}
}
作者:
依然
时间:
2014-1-15 22:16
finallyz中的数据会在return之前执行,finally只有在System.exit(0)后不执行
作者:
强子
时间:
2014-1-15 22:22
想明白整个程序的执行流程也就能明白了啊
首先你调用了print方法
在try中 1/0 会有异常 所以执行catch方法
catch方法中会先打印一个bb 然后return cc
要知道 return会终止一个方法的执行,就是说按常理来说,方法中return cc 之后的代码都不会执行
但是你后面用了finally 这个又是一个特殊的关键字 finally里面的代码是一定会执行的,所以在print方法执行完毕之前会执行finally里面的打印dd 也就是在return cc之前打印dd
之后main函数中接受到print的返回值cc才会打印出cc
所以结果是bb dd cc
希望对你有帮助
作者:
孤独的天奇
时间:
2014-1-15 22:23
1. 1/0 放生异常,进去catch代码块,打印bb
2. 程序发现return语句,先去执行finally,打印dd
3. 返回cc 打印
作者:
黄晓鑫
时间:
2014-1-15 22:23
因为0在java中不能作为除数到那里就抛异常了 然后走了相应的catch语句运行时异常(runtimeException)所以程序跳转输出了cc然后finally是一定要执行的语句先执行了一下dd然后程序再跳回来执行了cc aa是执行不到了因为除0已经发生异常也对异常进行了处理
作者:
dapeng111
时间:
2014-1-15 22:24
catch (RuntimeException e) {
System.out.println("bb");
return "cc";
}
如catch代码所示,在因为在捕获到异常后,先执行了语句System.out.println("bb");输出"bb"
在输出bb后方法没有结束必须去执行finally,所以输出了"dd". 而"cc"的输出是因为方法在执行完成后,
将"cc"返回给主函数,通过语句 System.out.println(t.print());输出.
System.out.println(t.print());
作者:
松涛小玮
时间:
2014-1-15 22:24
我是这样理解 return 最后肯定是返回调用它的方法,但它之前,一定会有finally语句先执行。这样才算执行完代码 返回调用方法。所以finally算执行的代码,执行完后再返回方法。如果return改为 exit 则会不管finally 直接退出虚拟机
作者:
刘少来
时间:
2014-1-15 22:30
return "cc"只是把"cc"传递给了调用者,还没有开始打印,程序还没有结束,一定会执行的fianlly中先打印了"dd"之后print函数才结束此时回到主函数中打印刚才传过来的值,所以结构就是"bb" "dd" "cc"
作者:
依然
时间:
2014-1-15 22:42
黄晓鑫 发表于 2014-1-15 22:23
因为0在java中不能作为除数到那里就抛异常了 然后走了相应的catch语句运行时异常(runtimeException)所以 ...
哥们,为什么给我点评是山寨啊?他问题的重点是顺序的问题,我回答的虽然不是很完整,但不应该算是山寨吧。山寨应该是剽窃、赋值的代名词吧,还望给个说法,谢谢
作者:
黄晓鑫
时间:
2014-1-15 22:43
谢谢 随便点点 这个没有关系的 呵呵
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2