摘要:前言開發(fā)中,正常情況下,在執(zhí)行了代碼塊之后,中的代碼一定會執(zhí)行。上述在主線程和守護(hù)線程中都設(shè)置的原因是怕線程方法還未開始執(zhí)行主線程就退出了,這樣的話代碼塊中的內(nèi)容都不會執(zhí)行。當(dāng)然不是說守護(hù)線程中的代碼一定不會執(zhí)行。
前言
Java開發(fā)中,正常情況下,在執(zhí)行了try代碼塊之后,finally中的代碼一定會執(zhí)行。我們實(shí)際開發(fā)也經(jīng)常會利用這個(gè)特性,在finally中來執(zhí)行一些特殊的操作,比如:釋放資源、釋放鎖等。
demo
public class Finally { public static void main(String[] args) { try { //正常業(yè)務(wù)邏輯 System.out.println("I am try"); throw new RuntimeException("I am RuntimeExecption"); } catch (Exception e) { //異常處理 System.out.println("I am Exception -> " + e.getMessage()); } finally { //釋放資源等 System.out.println("I am Finally"); } } }
execute
I am try I am Exception -> I am RuntimeExecption I am Finally
那么是不是finally中的代碼一定會被執(zhí)行呢?
其實(shí)不然,目前作者了解到有兩種情況下,finally中的代碼不會被執(zhí)行(不考慮try之前出現(xiàn)異常或者return的情況,換言之,在try之前出現(xiàn)異?;蛘遰eturn時(shí),try對應(yīng)的finally中的內(nèi)容不會被執(zhí)行)
finally之前虛擬機(jī)被停止demo
public class Finally { public static void main(String[] args) { try { //正常業(yè)務(wù)邏輯 System.out.println("I am try"); throw new RuntimeException("I am RuntimeExecption"); } catch (Exception e) { //異常處理 System.out.println("I am Exception -> " + e.getMessage()); System.exit(1);//異常關(guān)閉虛擬機(jī) } finally { //釋放資源等 System.out.println("I am Finally"); } } }
execute
I am try I am Exception -> I am RuntimeExecption
上面的代碼在出現(xiàn)了異常之后,使用System.exit(1)退出關(guān)閉虛擬機(jī),finally中的代碼當(dāng)然無法執(zhí)行。
守護(hù)線程中的finallydemo
public class Finally { public static void main(String[] args) throws Exception { Thread thread = new Thread(new Runnable() { public void run() { try { //正常業(yè)務(wù)邏輯 System.out.println("I am try"); Thread.sleep(1000); } catch (Exception e) { //異常處理 System.out.println("I am Exception -> " + e.getMessage()); } finally { //釋放資源等 System.out.println("I am Finally"); } } }); thread.setDaemon(true); thread.start(); Thread.sleep(1000); System.out.println("end"); } }
execute
I am try end
使用setDaemon(true)方法來設(shè)置線程為守護(hù)線程,從打印結(jié)果中可以看到,守護(hù)線程中,try代碼塊中的代碼執(zhí)行了,finally代碼塊未必執(zhí)行。主要原因是因?yàn)槭刈o(hù)線程會隨著所有非守護(hù)線程的退出而退出。上述在主線程和守護(hù)線程中都設(shè)置sleep(1000)的原因是怕線程run()方法還未開始執(zhí)行主線程就退出了,這樣的話try代碼塊中的內(nèi)容都不會執(zhí)行。當(dāng)然不是說守護(hù)線程中的finally代碼一定不會執(zhí)行。
總結(jié)java中,如果想要執(zhí)行try中的代碼之后,不允許再執(zhí)行finally中的代碼,有以下兩種方式:
使用System.exit(1)來退出虛擬機(jī)
把當(dāng)前執(zhí)行trycatchfinally代碼的線程設(shè)置為守護(hù)線程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74364.html
摘要:奇怪的代碼行這里第一行為什么加了而且還要聲明一個(gè)局部變量探尋緣由經(jīng)過搜索找到的解釋本質(zhì)上是由于內(nèi)存模型和之間的不同如果我們直接使用函數(shù)內(nèi)使用的執(zhí)行時(shí)序函數(shù)僅會保存的指針會在使用的地方通過指針獲取對象然后再調(diào)用相應(yīng)方法例如好像還可以接受嘛但 奇怪的代碼 JDK 1.8 | java.util.concurrent.locks.ReentrantLock | 125行 /** * Pe...
摘要:子線程往消息隊(duì)列發(fā)送消息,并且往管道文件寫數(shù)據(jù),主線程即被喚醒,從管道文件讀取數(shù)據(jù),主線程被喚醒只是為了讀取消息,當(dāng)消息讀取完畢,再次睡眠。因此的循環(huán)并不會對性能有過多的消耗。 說下你所知道的設(shè)計(jì)模式與使用場景 a.建造者模式: 將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 使用場景比如最常見的AlertDialog,拿我們開發(fā)過程中舉例,比如Camera...
摘要:廣州三本大三在讀,在廣州找實(shí)習(xí)。這篇文章其實(shí)主要是記錄一下自己的面試經(jīng)歷,希望大家看完之后能有所了解進(jìn)入中小公司究竟需要什么水平。時(shí)間復(fù)雜度盡量低一些使用快排的,將給出的隨機(jī)數(shù)做基準(zhǔn)值返回的坐標(biāo)就是了。 前言 只有光頭才能變強(qiáng) 這陣子跑去面試Java實(shí)習(xí)生啦~~~我來簡單介紹一下背景吧。 廣州三本大三在讀,在廣州找實(shí)習(xí)。大學(xué)開始接觸編程,一個(gè)非常平庸的人。 在學(xué)習(xí)編程時(shí),跟我類似的人應(yīng)...
閱讀 2492·2021-11-24 09:39
閱讀 3536·2019-08-30 15:53
閱讀 610·2019-08-29 15:15
閱讀 2918·2019-08-26 13:23
閱讀 3231·2019-08-26 10:48
閱讀 661·2019-08-26 10:31
閱讀 787·2019-08-26 10:30
閱讀 2377·2019-08-23 18:32