在try,catch,finally中return,throw覆盖的问题总结

来源:互联网 发布:我的世界,java.net 编辑:程序博客网 时间:2024/06/06 01:58
先给出一段代码,请大家思考一下这段代码的输出。
class T{public static void main(String[] args) {try {if (testEx()) {System.out.println("程序正常o^o");}else{System.out.println("程序异常T_T");}} catch (Exception e) {// TODO: handle exceptionSystem.out.println("发生除零异常啦~~~~");}}public static boolean testEx(){boolean ok=true;try {int i=3/0;return false;} catch (Exception e) {// TODO: handle exceptionSystem.out.println("发生除零异常");throw e;}finally {return ok;}}}

你的答案是否是:

发生除零异常

发生除零异常啦~~~~

那么恭喜你,答错啦~~~

正确的答案应该是:

发生除零异常

程序正常o^o

为什么会这样呢?我们知道在java中,无论是return还是抛出异常,都会导致方法的结束。但是java中finally语句又必须执行,所以finally语句的执行时机应该是在try语句中的return语句之前,或者catch语句中throw语句执行之前。不然,无论是return语句执行,还是throw语句执行,都将导致finally语句无法得到执行。又由于在finally语句中,书写了return语句,就是这么个return语句,将导致方法的提前结束,因而无论是try中的return语句,还是catch中的throw语句,都将失去执行的机会,仿佛被覆盖掉了一般。因此有了以上的结果。



原创粉丝点击