標籤:java異常 關鍵字try 關鍵字catch 關鍵字finally 關鍵字throw 關鍵字throws
異常
程式中不正常的情況分為兩大類:錯誤(Error)和異常(Exception)
錯誤(Error):程式本身無法對這種不正常的情況進行處理,將會導致程式崩潰;
例如:記憶體耗盡錯誤,JVM崩潰錯誤等
異常(Exception):程式可以特殊的代碼,對不正常的情況進行捕獲和處理,程式可以繼續運行;
例如:除零異常,null 指標異常,數組下標越界異常
捕獲異常
文法格式1:try{ //可能出現異常的代碼 }catch(異常類 變數名){//出現異常後的處理代碼//printStackTrace();方法會輸出棧記憶體中的異常資訊變數名. printStackTrace();}文法格式2:try{//可能出現異常的代碼}finally{//finally塊:一般釋放資源的語句,比如關閉流,關閉資料庫的串連}finally:不管try中的代碼是否出現異常,都會執行finally塊中的代碼文法格式3:try{ }catch(異常類 變數名){}finally{ //即使try塊或catch塊中出現return語句,finally塊中依然會執行 //如果在try塊或catch塊中出現System.exit(int);語句,finally塊將無法執行}多重catch塊:多重catch塊中的異常類,一定是從小到大排列,兄弟異常類不分順序try{ }catch(子異常類 變數名){}catch(子異常類 變數名){}catch(父異常類 變數名){}...[finally{}]try、catch和finally都不能單獨存在,但是try和catch 、 try和finally 可以在一起使用,catch和finally不能單獨在一起使用
聲明異常
文法格式:[存取修飾詞] 傳回值類型 方法名() throws 異常類{}
拋出異常
文法格式:throw 異常對象;
執行個體:package exception;/** * 示範異常的聲明和拋出 * * @author 學霸聯盟 - 趙燦 */public class ExceptionDemo {//聲明方法m1,並聲明該方法會出現一個RuntimeException類型的異常public void m1() throws RuntimeException {/* * 拋出一個RuntimeException類型的異常,沒有使用try-catch捕獲 * 使用聲明異常的方式,將此處拋出的異常交給調用者m2處理 * 聲明異常的類型,必須是拋出異常類型或其父類型 */throw new RuntimeException();}//聲明方法m2,並聲明該方法會出現一個Exception類型的異常public void m2() throws Exception {try {// 調用聲明了RuntimeException異常的方法m1// 並使用try-catch處理m1中拋出的異常m1();/*因為catch塊是按照異常類型匹配捕獲的,而方法m1聲明的是RuntimeException;所以catch的小括弧中只能聲明RuntimeException或RuntimeException父類型的變數不能聲明RuntimeException的子類變數,因為這樣不能保證異常被捕獲 */} catch (Exception ex) {// 此處拋出了一個Exception類型的異常// 沒有使用try-catch進行捕獲處理,所以該方法也必須聲明異常throw new Exception();} finally {/* * 不管try和catch塊中的代碼是否拋出異常,finally塊中的代碼都會執行 * 即使try或catch塊中執行了return語句,finally塊中的代碼也會執行 * 除非try或catch塊中執行了System.exit(int); * 或出現錯誤導致JVM崩潰,finally將不再執行 */}}// 方法m3public void m3() {try {/* * 調用聲明了Exception異常的方法m2,而m3沒有聲明異常, * 所以必須使用try-catch塊處理方法m2產生的異常 */m2();} catch (Exception ex) {/* * 拋出Exception類型的異常,而且沒有使用try-catch進行捕獲,也沒有聲明異常; * 但是在finally塊中使用的return語句,所以代碼可以正常編譯和執行 */throw new Exception();} finally {/* * finally塊中使用了return語句; * 會將catch塊中拋出的Exception類型的異常覆蓋; * 所以該方法可以既不聲明異常,也不使用try-catch處理catch塊中拋出的異常; * 一般不建議這樣使用 */return;}}public static void main(String[] args) {ExceptionDemo t = new ExceptionDemo();t.m1();}}
自訂異常
繼承Exception或Exception的子類
執行個體:/*** 示範自訂異常類* @author 學霸聯盟 - 趙燦*/public class MyExceptionDemo extends Exception{public static void main(String[] args) {try {throw new MyException();} catch (MyException e) {//調用printStackTrace方法e.printStackTrace();}}}/*** 建立自訂異常類MyException,繼承Exception類或Exception的子類* @author 學霸聯盟 - 趙燦*/class MyException extends Exception{/** * 重寫父類中的printStackTrace */@Overridepublic void printStackTrace() {System.out.println("恭喜你,中了我的自訂異常!");}}
本文出自 “學霸聯盟教育官方部落格” 部落格,轉載請與作者聯絡!
I學霸官方免費教程三十八 :Java基礎教程之異常