在什么情况下,finally {}块将不执行?
在Java try{} ... catch{} ... finally{}
块中,finally{}
无论try /
catch中发生了什么,通常都认为其中的代码可以“保证”运行。但是,我知道至少有两种情况 不会 执行:
- 如果
System.exit(0)
被调用;要么, - 如果异常一直抛出到JVM,并且发生默认行为(即
printStackTrace()
退出)
是否有其他程序行为会阻止finally{}
块中的代码执行?代码将在什么特定条件下执行或不执行?
正如NullUserException所指出,第二种情况实际上是不正确的。我以为是因为标准错误的文本在标准输出之后打印出来,从而阻止了文本的滚动显示。:)
道歉。
回答:
如果调用System.exit()
,程序将立即退出而不finally
被调用。
JVM崩溃(例如分段错误)也将阻止最终被调用。也就是说,JVM此时会立即停止并生成崩溃报告。
无限循环也将阻止finally被调用。
当抛出Throwable时,总是调用finally块。即使您调用Thread.stop()ThreadDeath
也会触发将a
引发到目标线程中。可以捕获到它(是Error
),并会调用finally块。
public static void main(String[] args) { testOutOfMemoryError();
testThreadInterrupted();
testThreadStop();
testStackOverflow();
}
private static void testThreadStop() {
try {
try {
final Thread thread = Thread.currentThread();
new Thread(new Runnable() {
@Override
public void run() {
thread.stop();
}
}).start();
while(true)
Thread.sleep(1000);
} finally {
System.out.print("finally called after ");
}
} catch (Throwable t) {
System.out.println(t);
}
}
private static void testThreadInterrupted() {
try {
try {
final Thread thread = Thread.currentThread();
new Thread(new Runnable() {
@Override
public void run() {
thread.interrupt();
}
}).start();
while(true)
Thread.sleep(1000);
} finally {
System.out.print("finally called after ");
}
} catch (Throwable t) {
System.out.println(t);
}
}
private static void testOutOfMemoryError() {
try {
try {
List<byte[]> bytes = new ArrayList<byte[]>();
while(true)
bytes.add(new byte[8*1024*1024]);
} finally {
System.out.print("finally called after ");
}
} catch (Throwable t) {
System.out.println(t);
}
}
private static void testStackOverflow() {
try {
try {
testStackOverflow0();
} finally {
System.out.print("finally called after ");
}
} catch (Throwable t) {
System.out.println(t);
}
}
private static void testStackOverflow0() {
testStackOverflow0();
}
版画
finally called after java.lang.OutOfMemoryError: Java heap spacefinally called after java.lang.InterruptedException: sleep interrupted
finally called after java.lang.ThreadDeath
finally called after java.lang.StackOverflowError
注意:在每种情况下,即使在SO,OOME,Interrupted和Thread.stop()之后,线程仍保持运行状态!
以上是 在什么情况下,finally {}块将不执行? 的全部内容, 来源链接: utcz.com/qa/416888.html