finally区域的内容一定会执行吗?

当代码没有进行到与finally配套的try/catch语句中时。

1.在执行try块之前直接return,发现finally块是不会执行的

public class TryCatchTest {
  private static int total() {
  int i = 11;
  if (i == 11) {
  return i;
  }
  try {
  System.out.println("执行try");
  } finally {
  System.out.println("执行finally");
  }
  return 0;
}
public static void main(String[] args) {
  System.out.println("执行main:" + total());
  }
}

输出结果:

执行main:11

2.在执行try块之前制造一个错误,发现finally块是不会执行的

private static int total() {
return 1 / 0;
try {
System.out.println("执行try");
} finally {
System.out.println("执行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
当代码进入到与finally配套的try/catch语句中。

1.写入代码:System.exit(0),它表示退出当前Java虚拟机,一旦退出Java虚拟机,任何代码都不会再执行。

2.线程被终止或打断:如果当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。

3.当线程为守护线程时,如果主线程死亡了,finally也不会执行的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容