协慌网

登录 贡献 社区

finally 块总是在 Java 中执行吗?

考虑到这段代码,我可以绝对确定 finally块总是执行,无论是什么something()

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

答案

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

finally不会被召唤的唯一时间是:

  1. 如果你调用System.exit() ;
  2. 如果 JVM 首先崩溃;
  3. 如果 JVM 在trycatch块中到达无限循环(或其他一些不可中断的,非终止语句);
  4. 如果操作系统强行终止 JVM 进程; 例如 UNIX 上的 “kill -9”。
  5. 如果主机系统死亡; 例如电源故障,硬件错误,操作系统恐慌等。
  6. 如果最终块将由守护程序线程执行,并且所有其他非守护程序线程在最终被调用之前退出。

示例代码:

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

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

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

从 finally 块中抛出异常也是一样的。