关于try-catch-finally的执行结果问题

猜想一下,下面的代码会打印出什么呢?

public class Indecisive {

    public static void main(String[] args) {
        System.out.println(decision());
    }

    static boolean decision() {
        try {
            return true;
        } finally {
            return false;
        }
    }

}

这段代码看起来极不合理,decision方法既返回true又返回false,但编译的时候并没有发现问题。运行后发现打印出的是false。什么原因呢?
原因就是在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行。无论try语句块是正常结束的,还是意外结束的,情况都是如此。在一条语句或一个语句块抛出了 个异常,或者对某个封闭型语句执行break或continue语句,或是像这个程序一样在方法中执行了return语句时,将发生意外结束。之所以称为意外结束,是因为它们阻止程序按顺序执行下面的语句。
当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally语句意外结束的原因将取决于finally语句块意外结束的原因。在上面的程序中,在try语句块中return语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return语句造成的。
关于更具体的try-catch-finally的执行结果可以参考JLS 14.20.2:http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20

基于上面的事实,在设计finally代码时,要保证finally可以正常结束,对于任何在finally语句中可能招聘的受检查异常都要进行处理,而不是任其传播。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 举例: Case1:try{} catch(){}finally{} return;显然程序按顺序执行。 Case...
    _Justin阅读 583评论 0 1
  • “就怕他不来!” “他现在看似厉害,可等他抵达天午城,离深渊海太远,他实力就会被压制到更低地步。天午城修行者们就算...
    im喵小姐阅读 550评论 0 0
  • 双手合十 感恩 今天是新的一天 和以前不一样 以前的自己不一样 谢谢奶奶的教诲 最近这段时间的真的钻牛角尖了 ...
    姜小禅阅读 294评论 0 0