考虑下面的代码,
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
块正在执行,但上面的输出不是每次都固定。
所以问题是,我们在这里抛出OutOfMemoryError
和
finally
块正在执行。这种情况对每种情况都适用吗?
如果是,则在finally
时执行OutOfMemoryError
阻止
将被抛入现实,意味着内存区域将扩大
在执行时执行并且有足够的内存不可用?
答案 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块。