日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

finally块不被执行的情况总结

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 finally块不被执行的情况总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

finally塊的作用

通常用于處理善后工作。當try塊里出現異常時,會立即跳出try塊,到catch塊匹配對應的異常,執行catch塊里的語句。此時,可能在try塊里存在打開的文件沒關閉,連接的網絡沒斷開,這部分資源是GC所不能自動處理的,所以finally的作用就是將它們及時釋放回收。

finally塊不被執行的情況,總共有3種:不進入try塊、程序中止、線程中止(帶finally塊的是守護線程,其非守護線程都執行完畢)。

1. 未執行try塊

對于try-catch-finally或者try-finally,如果不能進入try塊,則finally塊也無法進入。

public class Test {public static void main(String[] args) {boolean flag = false;if(flag) {try {System.out.println("enter try block");} finally {System.out.println("enter finally block");}}} }/******************控制臺無輸出*******************/

2. System.exit()

public class Test {public static void main(String[] args) {try {System.out.println("enter try block");System.exit();} finally {System.out.println("enter finally block");}} } /***************** 控制臺打印如下 enter try block ******************/

3. try塊陷入無限循環

public class Test {public static void main(String[] args) {try {while(true){System.out.println("enter try block");}} finally {System.out.println("enter finally block");}} } /*****************完蛋*****************/

4. 守護(daemon)線程被中止時

Java線程分為兩類,守護線程和非守護線程。當所有的非守護線程都終止時,無論守護線程存不存在,虛擬機都會kill掉所有的守護線程從而中止程序。

虛擬機中,執行main方法的線程就是一個非守護線程,垃圾回收則是另一個守護線程,main執行完,則程序中止,而不管垃圾回收線程是否中止。

所以,如果守護線程中存在finally代碼塊,那么當所有的非守護線程中止時,守護線程被kill掉,其finally代碼塊是不會執行的。

public class Test {public static void main(String[] args) {//main是一個非守護線程Thread thread = new Thread(new Task());thread.setDaemon(true); //設置thread為守護線程thread.start();TimeUnit.SECONDS.sleep(5); //阻塞5s.} } class Task implements Runnable {@Overridepublic void run() {System.out.println("enter run()");try {System.out.println("enter try block");} catch(InterruptedException e) {System.out.println("enter catch block");} finally {System.out.println("enter finally block");}} } /******************* 控制臺打印如下 enter run() enter try block enter try finally block ********************/

上述代碼,語句 TimeUnit.SECONDS.sleep(5); 會使main線程阻塞5秒,足夠線程thread執行。

如果將該語句注釋,非守護線程main線程執行完 thread.start(); 這行后,存在三種情況:①CPU時間片還是交給main線程,則非守護線程執行完畢,守護線程thread就會被終止,finally塊不執行;②CPU時間片交給thread線程,但是thread線程剛執行完try塊,就得交付時間片給main,main已經無語句執行,就會結束,導致守護線程thread也要結束,finally塊不執行;③CPU時間片交付thread線程,thread線程完全執行,finally塊被執行。

其他迷惑性選項

(1)當try塊里面包含有break,該次try塊結束后,finally塊也會執行。

public class Test {public static void main(String[] args) {for (int i = 0; i < 5; i++) {try {if (i == 2) {break;}} finally {System.out.print(i);}}} }/*************輸出結果:012 **************/

(2)當try塊里面包含有return,該次try塊結束后,finally塊也會執行。

public class Test {public static void main(String[] args) {for (int i = 0; i < 5; i++) {try {if (i == 2) {return;}} finally {System.out.print(i);}}} }/*************輸出結果:012 **************/

(3)當try塊里面包含有continue,該次try塊結束后,finally塊也會執行。

public class Test {public static void main(String[] args) {for (int i = 0; i < 5; i++) {try {if (i == 2) {continue;}} finally {System.out.print(i);}}} }/*************輸出結果:01234 **************/

總結

以上是生活随笔為你收集整理的finally块不被执行的情况总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。