異常筆記--java編程思想

來源:互聯網
上載者:User

標籤: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編程思想

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.