標籤:類方法 import 如何 格式 length auto 運行時異常 main 練習
package cn.china;/** * 異常:在運行時期發生的不正常情況。 * 問題很多,意味著描述的類也很多, * 將其共性進行向上抽取,形成異常體系。 * 最終問題就分成兩大類: * throwable:無論是Error,還是異常,都是問題,就應該可以拋出,讓調用者知道並處理。 * 該體系的特點就在於throwable及其所有子類都具有可拋性。 * 如何體現可拋性? * 其實是通過兩個關鍵字體現的,throws,throw;凡是可以被這兩個關鍵字操作的類和對象都具有可拋性。 * 1、一般不可處理的,Error * 特點:是由JVM拋出的嚴重性問題,已經影響到我們程式的執行;這種問題發生一般不針對性處理,直接修改程式 * 2、可以處理的,Exception * 特點:子類的尾碼名都是用其父類名作為尾碼,閱讀性很強。 * * 異常分類: * 1、編譯時間被檢測異常:只要是Exception和其子類都是,除了RunTimeException和其子類 * 這種問題一旦出現,希望在編譯時間就進行檢測,讓這種問題有對應的處理方式。 * 這樣的問題都可以針對性的處理 * 2、編譯時間不檢測異常(運行時異常):RunTimeException和其子類。 * 這樣的問題的發生,無法讓功能繼續,運算無法進行,更多是因為調用的原因導致的或者引發了內部狀態的改變導致的。 * 這種問題一般不處理,直接編譯通過,在運行時,讓調用者調用時的程式強制停止,讓調用者對代碼進行調整。 * * throw 和 throws區別? * throws 使用在函數上 拋出的是異常類,可以拋出多個可以用逗號隔開 * throw 使用在函數內 拋出的是異常對象*/class FuShuIndexException extends Exception//所以這裡可以繼承RunTimeException,就不需要聲明或者捕捉異常,編譯不會失敗{ public FuShuIndexException(String meg) { super(meg); // TODO Auto-generated constructor stub }}class D{ public int method(int arr[],int index)throws FuShuIndexException { if(arr==null) throw new NullPointerException("數組的引用不可為空!"); if(index>=arr.length) throw new ArrayIndexOutOfBoundsException("數組越界了!"+index); if(index<0)//準備用負數角標異常來表示,但是這種異常在java中並沒有定義過。按照java異常的建立思想,將負數角標進行自訂描述,並封裝成對象 throw new FuShuIndexException("數組的角標不能為負數"+index); return arr[index]; }}public class Demo { public static void main(String[] args) throws FuShuIndexException { int[]arr=new int[3]; D d=new D(); int num= d.method(arr, -30); } }
package cn.china;/**異常處理的捕捉形式 * 具體格式: * try * {需要被檢測異常的代碼} * catch(異常類 變數) //該變數用於接收發生異常的對象 * {處理異常的代碼} * finally * {一定會被執行的代碼} * * * 異常處理原則: * 1、函數內部如果拋出需要檢測的異常,那麼函數上必須要聲明,否則必須在函數內必須要用trycatch捕捉,否則編譯失敗。 * 2、如果調用到了聲明異常的函數,要麼trycatch要麼throws,否則編譯失敗。 * 3、什麼時候catch,什麼時候throws呢? * 功能內部可以解決,用catch; * 解決不了用throws,告訴調用者,調用者解決; * 4、一個功能如果拋出多個異常,那麼調用時必須由對應多個catch進行針對性處理。 * 內部有幾個要檢測的異常,就拋幾個異常,拋出幾個,就catch幾個;*/class FuShuIndexException extends Exception//所以這裡可以繼承RunTimeException,就不需要聲明或者捕捉異常,編譯不會失敗{ public FuShuIndexException(String meg) { super(meg); }}class C{ public int method(int arr[],int index)throws FuShuIndexException { if(arr==null) throw new NullPointerException("數組的引用不可為空!"); if(index>=arr.length) throw new ArrayIndexOutOfBoundsException("數組越界了!"+index); if(index<0)//準備用負數角標異常來表示,但是這種異常在java中並沒有定義過。按照java異常的建立思想,將負數角標進行自訂描述,並封裝成對象 throw new FuShuIndexException("數組的角標不能為負數"+index); return arr[index]; }}public class Demo1 { public static void main(String[] args) { int[]arr=new int[3]; C c=new C(); try { int num= c.method(arr, -30); System.out.println("num"+num);//num是局部變數 所以這兩句話要放在同一個代碼塊 } catch(NullPointerException e){//多catch格式 e.printStackTrace(); } catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace(); } catch(FuShuIndexException e) { e.printStackTrace();//JVM預設的異常處理機制就是調用異常對象的這個方法。 System.out.println("Message"+e.getMessage()); System.out.println("String"+e.toString()); System.out.println("負數角標異常!"); } catch(Exception e){//父類需要放在最下面,不然編譯失敗,因為Exception跟所有異常都匹配, e.printStackTrace(); } System.out.println("over!"); }}
package cn.china;/**try catch finally 組合特點 * 1、 try catch finally * 2、try catch(多個當沒有必要資源需要釋放時,可以不用定義finally) * 3、 try finally * 例:void show()throws Exception //因為沒有catch所以必須聲明異常 * { * try{ * //開啟資源 * throw new Exception * } * finally{ * //關閉資源 * } * }*/class E{ public int method(int index) { int[]arr=new int[3]; if(index>=arr.length) throw new ArrayIndexOutOfBoundsException(); return arr[index]; }}public class Demo2 { public static void main(String[] args) { E e=new E(); try{int num=e.method(3); System.out.println(num); }catch(ArrayIndexOutOfBoundsException c) { System.out.println(c.toString()); return; //System.exit(0); 退出JVM只有這種情況不會執行finally語句; } finally {//一定會被執行的語句,主要用於關閉或者釋放資源 System.out.println("finally"); } System.out.println("over!"); }}
package cn.china;import java.time.format.TextStyle;/** * 畢老師用電腦上課, * 分析其中問題: * 電腦藍屏,冒煙*/class LanPingException extends Exception{ LanPingException(String msg){ super(msg); }}class MaoYanException extends Exception{ MaoYanException(String msg){ super(msg); }}class NoPlanException extends Exception{ NoPlanException(String msg){ super(msg); }}class Computer{ private int state=0; public void run()throws LanPingException,MaoYanException { if(state==1) throw new LanPingException("藍屏啦"); if(state==2) throw new MaoYanException("電腦冒煙了"); System.out.println("電腦運行"); } public void reset(){ state=0; System.out.println("電腦重啟了"); }}class Teacher{ private String name; private Computer comp; Teacher(String name){ this.name=name; comp=new Computer(); } public void prelect()throws NoPlanException { try { comp.run(); System.out.println("講課"); }catch(LanPingException e){ System.out.println(e.toString()); comp.reset(); prelect(); }catch(MaoYanException e){ System.out.println(e.toString()); test(); throw new NoPlanException("課時無法進行"+e.getMessage()); //可以對電腦進行維修 //throw e; } } public void test(){ System.out.println("大家練習"); }}public class Demo3 { public static void main(String[] args) { Teacher teacher=new Teacher("畢老師"); try { teacher.prelect(); } catch(NoPlanException e) { System.out.println(e.toString()+"......"); System.out.println("換人"); } }}/** * class NoAddException extends Exception{} * void addData(Data d)throws NoAddException * { * 連結資料庫 * try{ * 添加資料庫,出現異常 SQLException(); * }catch(SQLException e) * { * //處理代碼 * throw new NoAddException(); * }finally * { * * 關閉資料庫 * } * }*/
package cn.china;/**異常的注意事項 * 1、子類在覆蓋父類方法時如果父類的方法拋出異常,那麼子類的方法只能破案出父類的異常,或者該異常的子類 * 2、如果父類拋出多個異常,那麼子類子還能拋出父類異常的子集 * * 簡單說:子類覆蓋父類,只能拋出父類的異常,或者子集;如果父類沒有拋出異常,那麼子類覆蓋時絕對不能拋出異常,但是可以用try;*/class A extends Exception {}class B extends A{}class C extends Exception{}class Fu{ void show()throws A{}}class Zi extends Fu{ void show()throws B{}//只能拋出A或者B }class Test{ void method(Fu f){ try{ f.show(); }catch(A a){} }}public class Demo4 { public static void main(String[] args) { Test t=new Test(); t.method(new Zi()); }}
java===Exception異常處理