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