问题

考虑到这段代码,我能不能确定finally块总是执行,无论what()是什么?

try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("i don't know if this will get printed out.");
}

#1 热门回答(2069 赞)

是的,在执行try或catch代码块之后将调用finally

唯一不会被称为'finally'的是:

  • 如果你调用System.exit();
  • 如果JVM首先崩溃;
  • 如果JVM在try或catch块中到达无限循环(或其他一些不可中断的,非终止语句);
  • 如果操作系统强行终止JVM进程;例如UNIX上的“kill -9”。
  • 如果主机系统死亡;例如电源故障,硬件错误,操作系统恐慌等。

#2 热门回答(438 赞)

示例代码:

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

public static int test() {
    try {
        return 0;
    }
    finally {
        System.out.println("finally trumps return.");
    }
}

输出:

finally trumps return. 
0

#3 热门回答(319 赞)

此外,虽然这是一种不好的做法,但如果finally块中有return语句,它将胜过常规块的任何其他返回。也就是说,下面的块会返回false:

try { return true; } finally { return false; }

同样的事情,从finally块中抛出异常。


原文链接