Java異常處理中的一些特殊情況舉例
只使用try和finally不使用catch的原因和場景
JDK并發(fā)工具包中,很多異常處理都使用了如下的結(jié)構(gòu),如AbstractExecutorService,即只有try和finally沒有catch。
class X
{
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m()
{
lock.lock(); // block until condition holds
try
{
// ... method body
} finally
{
lock.unlock()
}
}
}
為什么要使用這種結(jié)構(gòu)?有什么好處呢?先看下面的代碼
public void testTryAndFinally(String name)
{
try
{
name.length();// NullPointerException
}
finally
{
System.out.println("aa");
}
}
傳遞null該方法的執(zhí)行結(jié)果是:在控制臺(tái)打印aa,并拋出NullPointerException。執(zhí)行流程是先執(zhí)行try塊,出現(xiàn)異常后執(zhí)行finally塊,最后向調(diào)用者拋出try中的異常。這種執(zhí)行結(jié)果是很正常的,因?yàn)闆]有catch異常處理器,所有該方法只能將產(chǎn)生的異常向外拋;因?yàn)橛衒inally,所以會(huì)在方法返回拋出異常之前,先執(zhí)行finally代碼塊中的清理工作。
這種做法的好處是什么呢?對(duì)于testTryAndFinally來說,它做了自己必須要做的事(finally),并向外拋出自己無法處理的異常;對(duì)于調(diào)用者來說,能夠感知出現(xiàn)的異常,并可以按照需要進(jìn)行處理。也就是說這種結(jié)構(gòu)實(shí)現(xiàn)了職責(zé)的分離,實(shí)現(xiàn)了異常處理(throw)與異常清理(finally)的解耦,讓不同的方法專注于自己應(yīng)該做的事。那什么時(shí)候使用try-finally,什么時(shí)候使用try-catch-finally呢?很顯然這 取決于方法本身是否能夠處理try中出現(xiàn)的異常 。如果自己可以處理,那么直接catch住,不用拋給方法的調(diào)用者;如果自己不知道怎么處理,就應(yīng)該將異常向外拋,能夠讓調(diào)用者知道發(fā)生了異常。即在方法的簽名中聲明throws可能出現(xiàn)而自己又無法處理的異常,但是在方法內(nèi)部做自己應(yīng)該的事情。
finally語句不會(huì)被執(zhí)行的情況
Java的finally語句不會(huì)被執(zhí)行的唯一情況是:先執(zhí)行了用于終止程序的System.exit()方法
public class Test
{
public static void main(String[] args)
{
try
{
System.out.println("Start");
System.exit(0);
}finally
{
System.out.println("Finally");
}
System.out.println("End");
}
}
輸出結(jié)果為:
Start
當(dāng)然,如果在執(zhí)行一般的沒有System.exit()語句的try語句時(shí),突然斷電了,這時(shí)所有進(jìn)程都會(huì)終止,也不會(huì)執(zhí)行finally語句。
相關(guān)文章
java application maven項(xiàng)目打自定義zip包實(shí)例(推薦)
下面小編就為大家?guī)硪黄猨ava application maven項(xiàng)目打自定義zip包實(shí)例(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Java+Eclipse+Selenium環(huán)境搭建的方法步驟
這篇文章主要介紹了Java+Eclipse+Selenium環(huán)境搭建的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06
JavaWeb使用Cookie模擬實(shí)現(xiàn)自動(dòng)登錄功能(不需用戶名和密碼)
不需要填寫用戶名和密碼自動(dòng)登錄系統(tǒng),其實(shí)現(xiàn)思路使用cookie模擬瀏覽器自動(dòng)登錄,對(duì)cookie實(shí)現(xiàn)自動(dòng)登錄功能感興趣的朋友一起學(xué)習(xí)吧2016-08-08
SpringBoot項(xiàng)目yml配置文件不自動(dòng)提示解決方案
這篇文章主要介紹了SpringBoot項(xiàng)目配置文件.yaml/.yml文件編寫時(shí)沒有自動(dòng)提示的解決方案,文章通過圖文結(jié)合的方式給大家講解的非常詳細(xì),需要的朋友可以參考下2024-06-06
Java遞歸遍歷樹形結(jié)構(gòu)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java遞歸遍歷樹形結(jié)構(gòu)的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-03-03

