在Java中,我們把異常當做一種對象來處理,正是異常機制的引入,使得我們的程序更加健壯。異常指示了一個不正常的條件,或者一個錯誤條件,簡單地說就是一個中斷了正常的指令流的事件。程序控制將無條件的拋至一個特定的代碼段,在此將捕獲異常並加以處理,由此將錯誤處理與程序的正常處理分離開來,錯誤就可以被單獨處理了。
異常由Exception類及其子類的實例表示,大多數包都定義了自己的異常類型,它們往往是Exception的子類,我們也可以自己定義異常的類型。當錯誤條件出現時,應有一段代碼用來創建異常對象。Exception對象要作為一個參數傳遞給負責處理的代碼塊,這就涉及到異常的拋出和捕獲。
如圖所示,可拋出的除了異常還有錯誤類。Error類通常指示一些重大的錯誤或者虛擬機錯誤,不應由程序捕獲。至於異常則分為兩類,分別是運行時異常和編譯時異常,或者可以叫做unchecked異常和checked異常。我們通常會遇到的IO異常和SQL異常都屬於checked異常,對於這種異常,編譯器要求我們必須對其進行處理。而runtime exception則可以不作處理,由虛擬機來接管。
出現異常時,要麼直接處理,要麼向上拋出,等待上層調用方法進行處理。如果始終沒有得到處理,那麼如果是多線程就由Thread.run()拋出,如果是單線程就由main()拋出,之後相應的線程或整個程序退出。Runtime Exception和Error都可以不做處理,因此程序在遇到此類錯誤時,如果沒有處理塊程序就會終止退出。
異常的處理方式:
1、try-catch-finally結構處理異常
try{ //正常代碼,包含可能出錯的代碼 //如果有return,先走finally再回來return }catch(異常類型 Exception e){ //異常處理 }finally{ //finally塊,無論程序是否出現異常都會運行 //異常的出口 }
2、暫不處理,向上拋出
throw用於手動拋出異常(系統無法識別的異常),throws進行聲明,用於說明方法有可能發成的錯誤類型,調用該方法時進行try-catch處理。如果不聲明,就需要在方法內進行try-catch處理。
public void setAge(int age) throws Exception{ if(age>=15&&age<=40){ this.age=age; }else{ throw new Exception("年齡必須在15到40之間!"); }
該例在調用setAge方法時,進行try-catch處理,或者繼續向上拋出。