標籤:new 引用 ... 作用 throwable can 編程 特殊情況 路徑
開一個新的系列,主要記一些瑣碎的重要的知識點,把書讀薄才是目的...特點: 代碼少,概念多...
1. 基本概念
異常是在當前環境下無法獲得必要的資訊來解決這個問題,所以就需要從當前環境跳出,就是拋出異常.
拋出異常後發生的幾件事: 1.在堆上建立異常對象. 2.當前的執行路徑中止
3. 當前環境拋出異常對象的引用.
4. 異常處理機制接管程式.
2. 異常結構
Throwable是Error和Exception的基類.
Error表示編譯時間和系統錯誤(除特殊情況外一般不用你關心),Exception是可以拋出的基本類型.
運行時異常(RuntimeExcption),他們會自動被虛擬機器拋出,就是編寫的方法中不需要顯示的拋出RuntimeException. 運行時異常被稱為"不受檢查異常",這種異常屬於錯誤,將被自動捕獲,不需要你親自動手.
RuntimeException代表的是編程錯誤:
- 無法預料的錯誤.比如在你控制範圍之外傳進來的null引用.
- 作為程式員,這個異常是應該在代碼中進行檢查的錯誤,比如 ArrayIndexOfBoundsException,就是因為沒有檢查一下數組的大小.
3. finally作用
注意點:
- 無論try 子句中異常是否拋出,finally子句總能被執行.
- 當涉及到break和continue子句時,finally子句也會執行.
finally主要用來把出記憶體之外的資源恢複到它們的初始狀態: 已經開啟的檔案和網路連接.
4. 異常的限制
當子類覆蓋父類的方法,只能拋出在基類方法的異常聲明中列出的那些異常,只有這樣使用基類的代碼才能應用在其衍生類別的對象上, 就是體現了物件導向的思想.
以下代碼摘自java編程思想第12章,12.9節.只粘貼了部分.
class BaseballException extends Exception {}class Foul extends BaseballException {}class Strike extends BaseballException {}abstract class Inning { public Inning() throws BaseballException {} public abstract void atBat() throws Strike, Foul; public void walk() {} // Throws no checked exceptions} class PopFoul extends Foul {}public class StormyInning extends Inning { // OK to add new exceptions for constructors, but you // must deal with the base constructor exceptions: public StormyInning() throws RainedOut, BaseballException {} // Overridden methods can throw inherited exceptions: public void atBat() throws PopFoul {}} 5. 構造器中的異常
構造器會把對象設定成安全的初始狀態,但還會有別的動作,比如開啟一個檔案,在使用完畢後才能關閉檔案. 但是如果在構造器中拋出了異常,請李行為就不能正常工作,比如關閉檔案.
比如以下這個類:
public class InputFile { private BufferedReader in; public InputFile(String fname) throws Exception { try { in = new BufferedReader(new FileReader(fname)); // Other code that might throw exceptions } catch(FileNotFoundException e) { System.out.println("Could not open " + fname); // Wasn‘t open, so don‘t close it throw e; } catch(Exception e) { // All other exceptions must close it try { in.close(); } catch(IOException e2) { System.out.println("in.close() unsuccessful"); } throw e; // Rethrow } finally { // Don‘t close it here!!! } } public String getLine() { String s; try { s = in.readLine(); } catch(IOException e) { throw new RuntimeException("readLine() failed"); } return s; } public void dispose() { try { in.close(); System.out.println("dispose() successful"); } catch(IOException e2) { throw new RuntimeException("in.close() failed"); } }} ///:~
當拋出FileNotFoundException時, FileReader構造失敗,這時檔案都沒有找到,當然沒必要關閉檔案,所以在最外層的try,finally中沒有關閉輸入資料流.
異常筆記--java編程思想