java的try-catch-finally块中,finally中的代码是否一定会执行?

有同事问我在java的try-catch-finally块中,finally中的代码是否一定会执行。

绝大多数情况下会执行,但是有两种情况不会,我只知道两种情况。

 

第一种很简单:

public class Test1 { public static void main(String[] args) { try { System.exit(1); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("main is over."); } } }

System.exit(1) 会让程序马上退出。

 

 

第二种稍有些麻烦,需要使用多线程:

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class Task implements Runnable { public void run() { try { Thread.sleep(1000); Thread t = new Thread(new Task2()); t.setDaemon(true); t.start(); System.out.println("Task1 is over."); } catch (InterruptedException e) { e.printStackTrace(); } } } class Task2 implements Runnable { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("Task2 is over."); } } } public class Test2 { public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); es.execute(new Task()); es.shutdown(); } }

 

在Task中将Task2设置为后台线程,当主线程结束后,后台线程会突然退出。Test2中,Task2 is over.并未打印。

你可能感兴趣的:(java的try-catch-finally块中,finally中的代码是否一定会执行?)