
首先有件事要和大家說一下:我的公眾號現在可以留言了!
出于種種不可抗力的原因(你們懂的),2018 年 3 月 12 號之后注冊的公眾號將不帶有留言功能,并且前三個月內注冊但并未使用的公眾號的留言功能也會被一并回收,所以我這個號注冊時就沒有留言了。最近我發現了可以用于留言的小程序,所以就借著這篇文章試驗一下這種留言功能。希望看到這篇文章的小伙伴們能夠給我留個言,我會一一回復的。
從開發工具談起:

這是我平常用的幾個編輯器。記得我剛開始學 C 語言,學 Java 的時候,還是用 Notepad++ 這種文本編輯器寫代碼,老師說是為了打基礎,加深記憶。后來做開發,開始接觸一些開發工具,什么 Dev C++,Eclipse,VS 還有 AndroidStudio 啥的,剛開始用的時候就覺得這些工具太神奇了,不光是組織你的工程文件,更是在你編寫代碼的時候幫你檢查錯誤。我相信,代碼自動補全和糾錯一定是一個開發者最常用到的功能。不過,我想你也一定不建議編程初學者在學習的時候就使用這種東西,因為功能實在是太好用了!(以至于不怎么需要動腦很多工作就自動完成了)
盡管當時覺得神奇,但是現在的我明白的:開發工具里的糾錯機制,正是來源于 Java 里對異常的判斷。編譯通過的軟件運行卻崩潰,也與它有關。借著還是初學者時的提問,今天再來把這個基礎知識復習一下
1.異常概述:
學過 Java 的小伙伴們應該都知道,在 Java 里,異常主要分兩種:Error (錯誤)和 Exception (例外),它們都繼承自 Throwable 類。也就是說 Java 中所有的異常處理機制都來源于這個類。兩個子類的區別非常好判斷,其實只要看名字就能知道:Error,表示“錯誤”,尤其是指那些比較嚴重的錯誤,比如保存文件時磁盤空間已滿。這種情況已經構成了代碼運行中徹徹底底的“錯誤”,而并非修改代碼就能解決的,所以作為開發者不必解決,只需要妥善地退出并彈出友好的提示即可。Exception 表示“例外”,這兩個字表示的含義很明確:一般沒事——只要你能按“規矩”使用/編寫軟件。這類異常是開發者所需要關心的。
2.代碼中的異常:
忘加分號、未定義變量之類的錯誤,開發工具都能在編寫時檢查出來,這類代碼中的問題如果不解決,就無法通過編譯,被稱為編譯時異常。而如果代碼通過了編譯,軟件開始運行后發生的錯誤則被成為運行時異常(RuntimeException)。比如在計算器軟件中讓 0 作為除數,開發者應該處理這樣的“例外”。這是 Exception 類里包涵的兩類情況。有一個簡單的判別方法:如果一個類繼承自 RuntimeException 類,就是運行時異常;如果直接繼承自 Exception 就是編譯時異常。

3.如何處理異常:
首先應該想一下,為什么我們非要去處理異常?如果不去處理的話又會發生什么?
在 Eclipse 輸入了以下代碼:

運行后的控制臺輸出:

顯然,程序會報錯。更重要的是程序會直接中斷(在沒有提示,更沒有安全措施的情況下),這才是開發者需要妥善處理異常的原因。
解決方法:很簡單,為了使得可能出現的異常得到處理并且程序不會中斷,代碼有兩種編寫方式,一種是 try...catch...finally組織代碼,另一種 throw/throws (直接拋出給調用者)。基本的用法我想大家都會用,我就不多說了,忘了的話稍微查一下書即可。值得注意的是,我看過一些視頻教程里的老師為了圖方便,在演示時把可能存在問題的大段代碼(并不是每行代碼都涉及異常)都用 try 給包住,然后直接只 catch 一個“Exception“。在課堂上這樣節省時間無可厚非,但是開發時最好不要這樣圖方便。軟件運行時,Java 虛擬機遇到 try 就進入了異常處理機制,會預留計算機資源來應對可能出現的異常。”try“ 里包含的代碼越多,可能涉及的異常種類就越多,就會在運行時占用更多資源(而并沒有真正使用),造成浪費。所以 try 結構里的代碼越少越好。當 try{} 里的代碼出現異常時,虛擬機會創建一個 Exception 對象與 catch 里的 Exception 參數進行匹配,然后運行對應catch里的代碼。
“throws ”跟在方法名之后,表示將可能出現的異常拋出,更多地只是一種標記,而 “throw”是一個具體的動作 —— 拋出一個異常對象。
好的,有關異常的內容就先寫到這,但還沒完。未來幾天我會再把 IO 方面的內容復盤一下,涉及異常的會一并補充。
謝謝你能讀到這里,歡迎留言討論!