一、全部異常都繼承於Throwable類,其下有兩大子類:java
(1)Error類:錯誤,通常編程人員不太接觸,如虛擬機錯誤、線程死鎖等。硬傷:使程序崩潰 ,沒辦法處理sql
(2)Exception類:異常,編碼、環境、用戶輸入等問題,其子類主要有:編程
非檢查異常(運行時異常RuntimeException):【由java虛擬機自動捕獲】 空指針NullPointer 越界ArrayIndexOutofBounds 錯誤類型轉換ClassCast 算數異常Arithmetic 等等
檢查異常CheckException:【須要手動添加捕獲和處理語句】文件IO異常、sql異常等等
異常處理: 1、try-catch(多catch塊)-finally (1)try塊:負責捕獲異常,一旦try中發現異常,程序的控制權將被移交給catch塊中的異常處理程序。【try語句塊不能夠獨立存在,必須與 catch 或者 finally 塊同存】 (2)catch塊:如何處理?好比發出警告:提示、檢查配置、網絡鏈接,記錄錯誤等。執行完catch塊以後程序跳出catch塊,繼續執行後面的代碼。 編寫catch塊的注意事項:多個catch塊處理的異常類,要按照先catch子類後catch父類的處理方式,由於會【就近處理】異常(由上自下)。 (3)finally:最終執行的代碼,用於關閉和釋放資源等 ============================================================ try{ //一些會拋出檢查異常的java語句 }catch(Exception e){ //處理該異常的代碼塊 }finally{ //最終要執行的代碼 } System.out.println(""); 若是有異常拋出,方法結束執行,異常會由系統捕獲,並交給相應的catch去處理(拋出提醒或記錄日誌等),異常代碼塊外代碼正常執行。 try會拋出不少種類型的異常,多個catch塊捕獲多鍾錯誤。 多重異常處理代碼塊順序問題:先子類再父類(順序不對也會提醒錯誤),finally語句塊處理最終將要執行的代碼
一、無論有木有出現異常,finally塊中代碼都會執行; 二、當try和catch中有return時,finally仍然會執行; 三、finally是在try和catch中的return後執行的(先把要返回的值保存起來,無論finally中的代碼怎麼樣,返回的值都不會改變,仍然是以前保存的值),因此函數返回值是在finally執行前肯定的; 四、finally中最好不要包含return,不然程序會提早退出,返回值不是try或catch中保存的返回值。而是finally中的值。 1.e.printStackTrace()能夠輸出異常信息 2.return -1:爲拋出異常的習慣寫法 3.若是方法中try,catch,finally中沒有返回語句,則會調用這三個語句塊以外的return結果 4.finally塊不管如何,無論前面是正常仍是異常,都要執行。 5.finally 在try中的return以後 在返回主調函數以前執行。
finally 在try中的return以後 在返回主調函數以前執行。網絡
兩個重要的關鍵字:throw和throws 1.throws的異常列表標識可能拋出的異常,多是拋出一條異常,也多是拋出多條異常,每一個類型的異常中間用逗號隔開 2.方法體中調用會拋出異常的方法或者是先拋出一個異常:用throw new Exception() throw寫在方法體裏,表示「拋出異常」這個動做 3.若是某個方法調用了拋出異常的方法,那麼必須添加try catch語句去嘗試捕獲這種異常,或者添加聲明,將異常拋出給更上一層的調用者進行處理
自定義異常: class 自定義異常類 extends 異常類型{} 上面的異常類型能夠是Exception,也能夠是其子類
一、處理運行時異常時,採用邏輯去合理規避同時輔助try-catch處理 二、在多重catch塊後面,能夠加一個catch(Exception)來處理可能會被遺漏的異常 三、對於不肯定的代碼,也能夠加上try-catch,處理潛在的異常 四、儘可能去處理異常,切記只是簡單的調用printStackTrace()去打印 五、具體如何處理異常,要根據不一樣的業務需求和異常類型去決定 六、儘可能添加finally語句塊去釋放佔用的資源