【讀後感】《Java編程思想》~ 異常
- 2020 年 3 月 10 日
- 筆記
【讀後感】《Java編程思想》~異常
終於拿出壓箱底的那本《Java編程思想》。這本書我年輕的時候就買了,但是翻過幾頁後就放棄了。沒想到這兩天翻了一下,真的有收穫。
看了一下第12章異常,有兩個地方令我感悟很深。
使用嵌套的try子句
public static void main(String[] args) { try{ InputFile in = new InputFile("Test01.java"); try{ String s; int i = 1; while (Objects.nonNull(s=in.getLine())){ System.out.println(s); //todo } }catch (Exception e){ System.out.println("catch exception in main"); e.printStackTrace(); }finally { in.dispose(); } }catch (Exception e){ System.out.println("construct InputFile error"); } } }
** 處理構造可能失敗,並且需要清理的對象 **,每個構造都必須包裹在自己的try-finally語句塊,並且每個對象構造器之後都必須跟隨一個try-finally語句塊,確保自己能夠被正確地清理。
上面這個就是我們工作中處理網絡連接、redis連接、IO文件連接的基本原型,看似日常,但是需要謹記(對我而言尤其是,畢竟有過redis連接忘記釋放耗盡連接池導致用戶登錄不進來的慘痛經歷)
"被檢查的異常"是否合理
這個是在第四版的12.12 其他可選方式 這章講述的。印象很深,因為我從來沒有思考過,Java異常設計的是否合理,沒有質疑過它的正確性。但是作者卻認為,"被檢查的異常"強製程序員在沒有做好準備的情況下被迫加上catch語句,這個導致"吞食則有害"的問題。就是說我們經常在catch中不處理異常或者不清楚如何處理,錯誤地處理了異常,而不是將異常拋出來。
這個問題我在項目中的代碼也經常看到,程序返回的結果不是我們想要的,但是卻沒有找到異常日誌,複查代碼的時候才發現,有catch語句"吞食"了異常。
雖然代碼編程規範告訴我們要拋出異常,但是為什麼一定要這麼做?期待程序員的自律,不如不給"吞食"的機會。
異常設計的初衷,我想就如作者所說,是為了跟方便地編程,寫C的時候,你不知道哪裡出了問題,只能藉助調試器一步步地debug,但是Java的異常機制可以讓我們放心地編程,因為異常機制會幫我們查找出出錯的位置。但是"被檢查的異常"有點違背這個初衷,似乎給了一條隱藏殘缺的捷徑。
千萬不要吞食異常,拋出來
觀點不一定正確,畢竟人的認知是不斷改變的,歡迎探討和指正。