1.異常的概念
java的異常指的是運行期出現的錯誤,觀察錯誤的名字和行號最重要
Java異常是Java提供的用于處理程序中錯誤的一種機制。
所謂錯誤是指在程序運行的過程中發生的一些異常事件(如:除以0溢出,數組下標越界,所要讀取的文件不存在)。
設計良好的程序應該在異常發生時提供處理這些錯誤的方法,使得程序不會因為異常的發生而阻斷或產生不可預見的結果。
Java程序的執行過程中如出現異常事件,可以生成一個異常類對象,該異常對象封裝了異常事件的信息并將被提交給Java運行時系統,這個過程叫做拋出異常。
當Java運行時系統接收到異常對象時,會尋找能處理這一異常的代碼并把當前異常對象交給其處理,這一過程稱為捕獲異常。
public void someMethod() { throws SomeException {//聲明該方法可能拋出的異常if(someCondition()) {throw new SomeException("錯誤原因"); //構造并拋出異常對象 } }}try{ //調用該方法是試圖捕捉異常 someMethod();}catch(SomeExceptione){ //定義處理異常的代碼//異常處理代碼;}捕獲異常:
public static void main(String[] array) { try { System.out.PRintln(2 / 0); } catch (ArithmeticException a) { System.out.println("系統正在維護,請稍候……"); a.printStackTrace(); } }結果是:
系統正在維護,請稍候……java.lang.ArithmeticException: / by zero
at Test1.Test.main(Test.java:7) 2.異常的分類
throwable:可被拋出的
error:系統的錯誤,處理不了的
exception:能夠處理的錯誤
runtimeException:經常出的錯誤,可以捕獲也可以不捕獲其他類Exception:必須要捕獲
RuntimeException異常:
void m(int i) throws ArithmeticException { if(i==0) throw newArithmeticException("被除數為0"); } //聲明m方法Test te = new Test();te.m(0);第一種沒有捕獲錯誤,程序也可以執行結果是:
Exception in thread "main" java.lang.ArithmeticException:被除數為0
at Test1.Test.m(Test.java:67) at Test1.Test.main(Test.java:25) 第二種捕獲錯誤:
try { newTest().m(0); } catch (ArithmeticExceptionae) { ae.printStackTrace(); System.out.println("出錯了"); } } 結果是:
出錯了java.lang.ArithmeticException: 被除數為0
at Test1.Test.m(Test.java:67) at Test1.Test.main(Test.java:29)Exception的其他錯誤: FileInputStream in = null; try{ in=new FileInputStream("myfile.txt"); int b; b=in.read(); while(b!=-1){ System.out.print((char)b); b=in.read(); } }catch(FileNotFoundException e){ e.printStackTrace(); } catch(IOException e){ System.out.println(e.getMessage()); }結果是:java.io.FileNotFoundException: myfile.txt (系統找不到指定的文件。)
at java.io.FileInputStream.open(NativeMethod) at java.io.FileInputStream.(Unknown Source) at java.io.FileInputStream.(Unknown Source) at Test1.Test.main(Test.java:41)Exception in thread "main" java.lang.NullPointerException at Test1.Test.main(Test.java:58)5.finally語句 try代碼段包含可能產生異常的代碼,后跟有一個或多個catch代碼段。每個catch代碼段聲明其能處理的一種特定類型的異常并提供處理方法,當異常發生時程序會終止當前的流程,根據獲取的異常的類型去執行相應的catch代碼段。
finally段的代碼無論try中的代碼是否發生異常都有執行,有異常時運行catch后在執行finally中的語句
try{
//可能拋出異常的語句 }catch(SomeException1 e){
……
}catch(SomeException2 e){
……
}finally{
……
}
在catch語句塊中可以使用e這個對象的一些方法獲取異常事件發生的信息。
如:getMessage()方法,用來得到有關異常事件的信息
printStackTrace()方法,用來跟蹤異常事件發生時執行堆棧的內容
finally語句:
finally語句為異常處理提供一個統一的出口,使得在控制流程轉到程序的其他部分以前,能夠對程序的狀態作統一的管理。
無論try所指定的程序塊中是否會拋出例外,finally所指定的代碼都要被執行
通常在finally語句中可以進行資源的清除工作,如:關閉打開文件,刪除臨時文件
finally {
try { in.close(); } catch (IOException e) { e.printStackTrace(); } } 6.聲明方法拋出的異常
一些方法處理不了一些Exception,可以拋出,給其他方法處理
public class Test { public static void main(String[] args) { try { new Test().f2(); } catch (IOException e) { e.printStackTrace(); } } void f() throws FileNotFoundException, IOException { FileInputStream in = new FileInputStream("myfile.txt"); int b; b = in.read(); while (b != -1) { System.out.print((char) b); b = in.read(); } } void f2() throws IOException { //處理f中的異常 f(); //運行這種情況,調用f2時,給f來處理 }}結果為:java.io.FileNotFoundException: myfile.txt(系統找不到指定的文件。)
at java.io.FileInputStream.open(NativeMethod) at java.io.FileInputStream.(Unknown Source) at java.io.FileInputStream.(Unknown Source) at Test1.Test.f(Test.java:12) at Test1.Test.f2(Test.java:30) at Test1.Test.main(Test.java:6) 運行是結果是:myfile.txt (系統找不到指定的文件。)
另一個例子:
public class Test { public static void main(String[] args) { Test test = new Test(); try { test.method1(); } catch (Exception e) { e.printStackTrace(); } } public void method1() throws Exception { method2(); } public void method2() throws Exception { method3(); } public void method3() throws Exception { throw new Exception("SomeException occur inmethod3"); }}結果是:java.lang.Exception: SomeException occur in method3
at Test1.Test.method3(Test.java:21) at Test1.Test.method2(Test.java:18) at Test1.Test.method1(Test.java:15) at Test1.Test.main(Test.java:8)7.一些其他問題 在try后面catch不能先大后小,不能先IoException,后FileNotFoundException,因FileNotFoundException包括在IoException中。
使用自定義的異常:
class 異常類名 extends Exception{
public異常類名(String msg) { super(msg); }} 1.通過繼承java.lang.Exception類聲明自己的異常類
2.在方法適當的位置生成自定義異常的實例,并用throw語句拋出
3.在方法的聲明部分用throws語句聲明該方法可能拋出的異常
public class MyException extends Exception { private int id; public MyException(String message, int id) { super(message); this.id = id; } public int getId() { return id; }}public class Test { public void regist(int num) throws MyException { if (num < 0) { throw new MyException("人數為負值,不合理", 3); } System.out.println("登記人數" + num); } public void manager() { try { regist(-1); } catch (MyException e) { System.out.println("登記失敗,出錯類型碼=" + e.getId()); e.printStackTrace(); //輸出的第一行包含該對象的tostring()方法的結果。 } System.out.println("操作結束"); } public static void main(String[] args) { Test t = new Test(); t.manager(); }}結果為:登記失敗,出錯類型碼=3Test1.MyException: 人數為負值,不合理
at Test1.Test.regist(Test.java:16) at Test1.Test.manager(Test.java:22) at Test1.Test.main(Test.java:31)操作結束
聲明并拋出異常
重寫方法需要拋出與原方法所拋出異常類型一致異?;虿粧伋霎惓?/p>
class A{
public void method() throws IOException{……}
//B1的繼承就不對,必須要和原方法一致,既不能大,也不能小
class B1 exrends A{public void method() throwsFileNotFoundException{……}}
}
class B2 extends A{public void method(){……}}這是可以的
新聞熱點
疑難解答