生活随笔
收集整理的這篇文章主要介紹了
04 - JavaSE之异常处理
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
異常的概念(運(yùn)行期出現(xiàn)的錯(cuò)誤) java 異常是 java 提供的用于處理程序中錯(cuò)誤的一種機(jī)制。
所謂的錯(cuò)誤是指在程序運(yùn)行的過程中 發(fā)生的一些異常事件。(如:除0溢出,數(shù)組下標(biāo)越界,所要讀取的文件不存在)
設(shè)計(jì)良好的程序應(yīng)該在異常發(fā)生時(shí)提供處理這些錯(cuò)誤的方法,使得程序不會(huì)因?yàn)楫惓5陌l(fā)生而阻斷或產(chǎn)生不可預(yù)見的結(jié)果。
java 程序的執(zhí)行過程中如果出現(xiàn)異常事件,可以生成一個(gè)異常類對象,該異常對象封裝了異常事件的信息并將被提交給java運(yùn)行時(shí)系統(tǒng),這個(gè)過程被稱為拋出(throw)異常。
當(dāng) java 運(yùn)行時(shí)系統(tǒng)接收到異常對象時(shí),會(huì)尋找能處理這一異常的代碼并把當(dāng)前異常對象叫給其處理,這一過程稱為捕獲(catch)異常。
try里面編寫可能拋出異常的代碼,catch編寫捕獲異常后處理的代碼。
把發(fā)生異常的堆棧打印出來:e.printStackTrace();
異常的分類 異常根類 Throwable 分子類 Error + Exception
Error 是系統(tǒng)內(nèi)部錯(cuò)誤(虛擬機(jī)生成并拋出,包括動(dòng)態(tài)鏈接失敗,虛擬機(jī)錯(cuò)誤等,程序不對其做處理)。
Exception是我們可以處理的所有異常類的父類,其子類對應(yīng)了各種各樣可能出現(xiàn)的異常事件,一般需要用戶顯式的聲明或捕獲。
Exception 分 RuntimeException(運(yùn)行期異常)+ 其他。
RuntimeException:一類特殊的異常,如除0異常,數(shù)組下標(biāo)越界等,其產(chǎn)生的比較頻繁,處理麻煩,如果顯式的聲明或者捕獲將會(huì)對程序的可讀性和運(yùn)行效率影響很大。因此由系統(tǒng)自動(dòng)檢測并將它們交給缺省的異常處理程序,用戶可以catch,也可以不catch。
void m(int i) throws ArithmeticException {if(0==i) {throw new ArithmeticException("除0異常 1th");}
}public class Test {public static void main(String[] args) {try {Test t = new Test();t.m(0);} catch (Exception e) {System.out.println("除0異常 2th");}}
}
ArithmeticException int i = 1;
int k = 0;
int m = i/k;
NullPointerException String s = null;
int l = s.length();
ClassCastException Object o = new Object();
String s = (String)o;
int l = s.length();
NegativeArraySizeException int len = -1;
int[] a = new int[len];
a[0] = 0;
ArrayIndexOutOfBoundsException int len = 10;
int[] a = new int[len];
a[10] = 10;
異常的捕獲和處理 try語句制定了一段代碼,該段代碼就是一次捕獲并處理的例外的情況。 在執(zhí)行的過程中,該段代碼可能會(huì)產(chǎn)生并拋出一種或幾種類型的異常對象,它后面的catch語句要分別對這些異常做相應(yīng)的處理。 如果沒有例外產(chǎn)生,所有的catch代碼段都被忽略不執(zhí)行。 在catch語句塊中是對異常進(jìn)行處理的代碼,每個(gè)try語句塊可以伴隨一個(gè)或多個(gè) catch語句,用于處理可能產(chǎn)生的不同類型的異常對象。 在catch中聲明的異常對象(catch (someExpresion e))封裝了異常事件發(fā)生的信息,在catch語句塊中可以使用這個(gè)對象的一些方法獲取這個(gè)信息:例如:getMessage(); 用來得到有關(guān)異常事件的信息;printStackTrace();用來跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。 catch語句塊后面可以跟上一個(gè)finally語句塊。 finally語句為異常處理提供一個(gè)統(tǒng)一的出口,使得在控制流程轉(zhuǎn)到程序的其他部分以前,能對程序的狀態(tài)作統(tǒng)一的管理。 無論try所指向的程序是否拋出異常,finally所指定的代碼都要被執(zhí)行。 通常在finally語句中可以進(jìn)行資源的清理工作。如:關(guān)閉打開的文件;刪除臨時(shí)文件等。 FileInputStream in = null;try {in = new FileInputStream("myfile.txt");int b = 0;b = in.read();while(-1 != b) {System.out.print((char)b);b = in.rasd();}
}
catch (FileNotFoundException e) {e.printStackTrace();
}
catch (IOException e) {System.out.println(e.getMessage());
}
finally {try {in.clsoe();}catch (IOException e) {e.printStackTrace();}
}
異常的拋出 public void someMethod() throws someExpresion { if(someCondition()) {throw new someExpresion("錯(cuò)誤原因"); // 然后在某種情況下拋出這種異常}
}try {someMethod(); // 調(diào)用該方法時(shí)試圖捕獲異常
}
catch(someExpresion e) {// 異常處理代碼
}
** Tips:
public void someMethod() throws someExpresion:throws寫在后面聲明該方法可能拋出異常(由系統(tǒng)自動(dòng)拋出異常),如果寫了這句話,對于RuntimeException 則可以不catch,其他的異常則需要寫try catch,如果你不想寫try catch,則你可以再繼續(xù)往外拋(在方法后面寫throws)。 2.throw new someExpresion("錯(cuò)誤原因"); 表示的是手動(dòng)拋出異常。 **
public class Test {public static void main(String[] args) {Test t = new Test();try {t.method1();} catch (someException e) {e.printStackTrace();}}public void method1() throws someException {method2();}public void method2() throws someException {method3();}public void method3() throws someException {throw new someException("someException occur in method3.");}
}
注意
執(zhí)行throw語句之后,運(yùn)行流程立即停止(如上第一份代碼第二個(gè)End未打印)。然后系統(tǒng)立即檢查是否有能夠匹配的catch語句塊,如果找到則執(zhí)行對應(yīng)的catch語句塊,如果找不到則轉(zhuǎn)向上一層的try語句塊并繼續(xù)查找對應(yīng)的catch語句塊,如果一直找不到對應(yīng)的catch語句塊,則異常對象被拋到系統(tǒng)異常處理。 public class Test {public static void pro(String s) {if(s != null) {System.out.println(s);}else {throw new NullPointerException("Ooops!, s is null.");}System.out.println("End");}public static void main(String[] args) {try {pro("Hello Java");pro(null);}catch (Exception e) {System.out.println(e.getMessage());}}
}
/*
打印結(jié)果:
Hello Java
End
Ooops!, s is null.
*/
catch時(shí)注意:應(yīng)該先捕獲小的,再捕獲大的,否則編譯報(bào)錯(cuò)。 catch (NullPointerException e) {System.out.println("NullPointerException");
}
catch (Exception e) {System.out.println(e.getMessage());
}
使用自定義的異常 使用自定義異常一般有如下步驟:
通過集成 java.lang.Exception 類聲明自己的異常類。
在方法適當(dāng)?shù)奈恢蒙勺远x異常的實(shí)例,并用 throw 語句拋出。
在方法的聲明部分用 throws 語句聲明該方法可能拋出的異常。
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("人數(shù)為負(fù)。", 3);}System.out.println("登記人數(shù):" + num);}public void manager() {try {regist(100);}catch (MyException e) {System.out.println("登記失敗,出錯(cuò)類型碼:" + e.getId());e.printStackTrace();}System.out.println("操作結(jié)束");}public static void main(String[] args) {Test t = new Test();t.manager();}
}
異常與繼承 重寫方法需要拋出與原方法所拋出異常類型一致的異常或不拋出異常。
例如:
class A {public void method() throws IOException {...}
}class B1 extends A {public void method() throws FileNotFoundException {...} // 范圍小了,錯(cuò)誤
}class B2 extends A {public void method() throws Exception {...} // 范圍大了,錯(cuò)誤
}class B3 extends A {public void method() {...} // 正確
}class B3 extends A {public void method() throws IOException, MyException{...} // 錯(cuò)誤
}
轉(zhuǎn)載于:https://www.cnblogs.com/lvonve/p/8228409.html
總結(jié)
以上是生活随笔 為你收集整理的04 - JavaSE之异常处理 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。