try-cache-finally讀取文件錯(cuò)誤try-with-resources使用方法
引言
前些天項(xiàng)目經(jīng)理找到我說,阿杰,你過來一下,我這有個(gè)小方法,你幫我寫一下
- 需求: 提供一個(gè)文本文件,按行讀取,然后給出一個(gè)回調(diào)函數(shù),可以由調(diào)用者去實(shí)現(xiàn)對(duì)每行的處理.
我就想,你這不是瞧不起我嗎.5分鐘搞定!!嘴里卻說,你這個(gè)有點(diǎn)難,我需要研究下大概今天下班前能完成.
5分鐘過去了----> 代碼完成
摸魚3小時(shí) ----> ok 代碼一發(fā),收工準(zhǔn)備下班
public void clean2(String path, Consumer<String> consumer){
FileReader fileReader = null;
BufferedReader br = null;
try{
fileReader = new FileReader(path);
br = new BufferedReader(fileReader);
String line;
while((line = br.readLine()) != null ){
consumer.accept(line);
}
}catch (IOException e){
// do
}finally {
try {
if (br != null){
br.close();
}
if (fileReader != null){
fileReader.close();
}
} catch (IOException e) {
// do
}
}
}
項(xiàng)目經(jīng)理 ????????: 你tm明天別來了,自己去財(cái)務(wù)把這個(gè)月的結(jié)了,3行代碼就寫完的功能寫成這個(gè)鬼樣子.
那我就想啊,我寫的這么完美,那憑什么開除我,經(jīng)過我九九八十一天的苦思冥想,終于找到了問題的原因!!
try-cache-finally
try-finally 是java SE7之前我們處理一些需要關(guān)閉的資源的做法,無論是否出現(xiàn)異常都要對(duì)資源進(jìn)行關(guān)閉。*
如果try塊和finally塊中的方法都拋出異常那么try塊中的異常會(huì)被抑制(suppress),只會(huì)拋出finally中的異常,而把try塊的異常完全忽略。
這里如果我們用catch語句去獲得try塊的異常,也沒有什么影響,catch塊雖然能獲取到try塊的異常但是對(duì)函數(shù)運(yùn)行結(jié)束拋出的異常并沒有什么影響。
try-with-resources
try-with-resources語句能夠幫你自動(dòng)調(diào)用資源的close()函數(shù)關(guān)閉資源不用到finally塊。
前提是只有實(shí)現(xiàn)了Closeable接口的才能自動(dòng)關(guān)閉
public void clean(String path, Consumer<String> consumer) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while((line = br.readLine()) != null ){
consumer.accept(line);
}
}
}
這是try-with-resources語句的結(jié)構(gòu),在try關(guān)鍵字后面的( )里new一些需要自動(dòng)關(guān)閉的資源。
這個(gè)時(shí)候如果方法 readLine 和自動(dòng)關(guān)閉資源的過程都拋出異常,那么:
- 函數(shù)執(zhí)行結(jié)束之后拋出的是try塊的異常,而try-with-resources語句關(guān)閉過程中的異常會(huì)被抑制,放在try塊拋出的異常的一個(gè)數(shù)組里。(上面的非try-with-resources例子拋出的是finally的異常,而且try塊的異常也不會(huì)放在fianlly拋出的異常的抑制數(shù)組里)
- 可以通過異常的
public final synchronized Throwable[] getSuppressed()方法獲得一個(gè)被抑制異常的數(shù)組。 try塊拋出的異常調(diào)用getSuppressed()方法獲得一個(gè)被它抑制的異常的數(shù)組,其中就有關(guān)閉資源的過程產(chǎn)生的異常。
try-with-resources 語句能放多個(gè)資源,使用 ; 分割
try (
BufferedReader br = new BufferedReader(new FileReader(path));
ZipFile zipFile = new ZipFile("");
FileReader fileReader = new FileReader("");
) {
}
最后任務(wù)執(zhí)行完畢或者出現(xiàn)異常中斷之后是根據(jù)new的反向順序調(diào)用各資源的close()的。后new的先關(guān)。
try-with-resources 語句也可以有 catch 和 finally 塊
public void clean3(String path, Consumer<String> consumer){
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
System.out.println("RuntimeException 前");
int a = 1/0;
System.out.println("RuntimeException 后");
}catch (RuntimeException e){
System.out.println("拋出 RuntimeException");
}catch (IOException e){
System.out.println("拋出 RuntimeException");
}finally {
System.out.println("finally");
}
}
RuntimeException 前
拋出 RuntimeException
finally
以上就是try-cache-finally讀取文件錯(cuò)誤try-with-resources使用方法的詳細(xì)內(nèi)容,更多關(guān)于try-with-resources讀取文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java的Spring框架中DAO數(shù)據(jù)訪問對(duì)象的使用示例
這篇文章主要介紹了Java的Spring框架中DAO數(shù)據(jù)訪問對(duì)象的使用示例,分為在Spring中DOA與JDBC以及與Hibernate的配合使用兩種情況來進(jìn)行演示,需要的朋友可以參考下2016-03-03
SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼示例
ip2region v2.0 - 是一個(gè)離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,10微秒級(jí)別的查詢效率,提供了眾多主流編程語言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn),本文介紹了SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼工程,需要的朋友可以參考下2024-08-08
多模塊項(xiàng)目使用枚舉配置spring-cache緩存方案詳解
這篇文章主要為大家介紹了多模塊項(xiàng)目使用枚舉配置spring-cache緩存的方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Jedis零基礎(chǔ)入門及操作Redis中的數(shù)據(jù)結(jié)構(gòu)詳解
Jedis 的 API 方法跟 Redis 的命令基本上完全一致,熟悉 Redis 的操作命令,自然就很容易使用 Jedis,因此官方也推薦 Java 使用 Jedis 來連接和操作 Redis2022-09-09
SpringBoot整合Thymeleaf小項(xiàng)目及詳細(xì)流程
這篇文章主要介紹了SpringBoot整合Thymeleaf小項(xiàng)目,本項(xiàng)目使用SpringBoot開發(fā),jdbc5.1.48,主要涉及到Mybatis的使用,Thymeleaf的使用,用戶密碼加密,驗(yàn)證碼的設(shè)計(jì),圖片的文件上傳(本文件上傳到本地,沒有傳到數(shù)據(jù)庫)登錄過濾,需要的朋友可以參考下2022-03-03
Springboot自定義mvc組件如何實(shí)現(xiàn)
這篇文章主要介紹了Springboot自定義mvc組件如何實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
java圖片縮放實(shí)現(xiàn)圖片填充整個(gè)屏幕
這篇文章主要介紹了java圖片縮放實(shí)現(xiàn)圖片填充整個(gè)屏幕,本文提供了兩種解決方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
spring-boot react如何一步一步實(shí)現(xiàn)增刪改查
這篇文章主要介紹了spring-boot react如何一步一步實(shí)現(xiàn)增刪改查,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
Java 字符串轉(zhuǎn)float運(yùn)算 float轉(zhuǎn)字符串的方法
今天小編就為大家分享一篇Java 字符串轉(zhuǎn)float運(yùn)算 float轉(zhuǎn)字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
java通過MySQL驅(qū)動(dòng)攔截器實(shí)現(xiàn)執(zhí)行sql耗時(shí)計(jì)算
本文主要介紹了java通過MySQL驅(qū)動(dòng)攔截器實(shí)現(xiàn)執(zhí)行sql耗時(shí)計(jì)算,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

