在什么情况下,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 space

finally 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

回到顶部