最后在OutOfMemoryError的情况下执行块?

时间:2014-04-09 16:49:18

标签: java exception out-of-memory runtime-error finally

考虑下面的代码,

public class Test {

    public void abc() {
        try {
            throw new OutOfMemoryError();
        } finally {
            System.out.println("finally");
        }
    }

    public static void main(String[] args) {
        new Test().abc();
    }

}

输出:

Exception in thread "main" finally
java.lang.OutOfMemoryError
    at Test.abc(Test.java:5)
    at Test.main(Test.java:12)

因此,finally块正在执行,但上面的输出不是每次都固定。

  1. 所以问题是,我们在这里抛出OutOfMemoryErrorfinally块正在执行。这种情况对每种情况都适用吗?

  2. 如果是,则在finally时执行OutOfMemoryError阻止 将被抛入现实,意味着内存区域将扩大 在执行时执行并且有足够的内存不可用?

2 个答案:

答案 0 :(得分:2)

这就像Sotirios Delimanolis说的那样

更令人惊讶的是,即使你在你的try块中放了一个return,也会执行finally

来自doc:

  

“finaly block允许程序员避免使用清理代码   被意外绕过返回,继续或休息。把   finally块中的清理代码总是很好的做法,即使是   预计没有例外“

查看此内容以获取更多信息http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

答案 1 :(得分:2)

如果你试图在需要额外内存的finally块中做一些事情,事情就会变得有趣:

public class Finally {

    public void abc() {
        try {
            throw new OutOfMemoryError();
        } finally {
            byte[] b = new byte[1024*1024*1024];
            System.out.println("finally");
        }
    }

    public static void main(String[] args) {
        new Finally().abc();
    }
}

现在,当您执行代码(例如java -Xmx20m Finally)时,您很容易就会遇到可用堆已耗尽到finally块无法完全完成的情况,因此它的执行无法保证。所以我不建议在OutOfMemoryErrors的情况下依赖finally块。