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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java只使用try和finally不使用catch的原因和场景

發布時間:2023/12/1 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java只使用try和finally不使用catch的原因和场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDK并發工具包中,很多異常處理都使用了如下的結構,如AbstractExecutorService,即只有try和finally沒有catch。

class X {private final ReentrantLock lock = new ReentrantLock();// ...public void m(){lock.lock(); // block until condition holdstry {// ... method body} finally{lock.unlock()}} }

  

為什么要使用這種結構?有什么好處呢?先看下面的代碼

public void testTryAndFinally(String name){try{name.length();// NullPointerException }finally{System.out.println("aa");}}

?

傳遞null該方法的執行結果是:在控制臺打印aa,并拋出NullPointerException。執行流程是先執行try塊,出現異常后執行finally塊,最后向調用者拋出try中的異常。這種執行結果是很正常的,因為沒有catch異常處理器,所有該方法只能將產生的異常向外拋;因為有finally,所以會在方法返回拋出異常之前,先執行finally代碼塊中的清理工作。

這種做法的好處是什么呢?對于testTryAndFinally來說,它做了自己必須要做的事(finally),并向外拋出自己無法處理的異常;對于調用者來說,能夠感知出現的異常,并可以按照需要進行處理。也就是說這種結構實現了職責的分離,實現了異常處理(throw)與異常清理(finally)的解耦,讓不同的方法專注于自己應該做的事。那什么時候使用try-finally,什么時候使用try-catch-finally呢?很顯然這?取決于方法本身是否能夠處理try中出現的異常?。如果自己可以處理,那么直接catch住,不用拋給方法的調用者;如果自己不知道怎么處理,就應該將異常向外拋,能夠讓調用者知道發生了異常。即在方法的簽名中聲明throws可能出現而自己又無法處理的異常,但是在方法內部做自己應該的事情。

這可以參考ExecutorService.invokeAny()的方法簽名

<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;

  轉自?http://blog.csdn.net/aitangyong/article/details/38146833?utm_source=tuicool&utm_medium=referral

轉載于:https://www.cnblogs.com/Bonker/p/5407440.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java只使用try和finally不使用catch的原因和场景的全部內容,希望文章能夠幫你解決所遇到的問題。

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