JAVA-Exception&Error
JAVA——Exception&Error
在萬物皆對象的JAVA中,先讓我們看看Exception和Error的地位吧:
可見Exception和Error都繼承自Throwable類,所以二者既有相同也有不同之處。相同之處就是他們都是程序出錯導致的,或說程序不正常運行才會實例化的類,不同之處就在於產生他們的的程序的出錯原因不同,下面就來詳細比較一下。
一,Exception&Error
從命名來看Error貌似比Exception要嚴重一點,事實確實如此。Error產生的情況一般是指不大可能出現且不可預料的情況,如JVM本身不正常,內存溢出,棧溢出等一些比較嚴重,會使程序終止的情況。而Exception通常是一些可以預料
二,未受檢查異常和受檢查異常
1,Error和Exception的子類RuntimeException都是未受檢查的異常,也可以叫運行時異常,因為它們都是不可預料的,在程序運行時才會出現的異常。
2,Exception的其他子類是受檢查的異常,是指程序員可以在代碼中預料和捕捉到的程序異常,這也是程序員重點關註的地方。
三,異常處理
要搞清楚異常處理就得先知道try-catch-finally-return這幾個關鍵字的語法和使用,它們在程序中的語法位置如下:
try{ //可能會產生異常的語句 }catch(Exception e){ //產生異常後才會執行的代碼 }finally{ //不管有沒有產生異常,在執行完上面兩個代碼塊後,此處代碼都會執行 }
畫個流程圖更容易理解,如下:
註意:還有一個return的用法很多人會出錯,當try-catch-finally中出現return語句時,要註意代碼執行順序,在代碼中講解,如下:
public int f1() { int res=0; try { res=1; }catch(Exception e){ }finally { res=5; } return res; } /*上面這段代碼的執行結果按照前面的流程圖推一下很容易知道f1()方法的返回值是5 但如果是下面這種代碼形式呢 */ public int f2() { int res=0; try { res=1; return res; }catch(Exception e){ }finally { res=5; } return res; } /*f2()的返回值應該是1,因為在try中執行到return語句時程序會先將要return的值入臨時棧,此時finally中執行的操作改變res的值,但卻不會影響到存在臨時棧中return的值。 再看下面這種情況 */ public int f3() { int res=0; try { res=1; return res; }catch(Exception e){ }finally { res=5; return res; } } /*此時f3()返回值應該是5,因為程序會把finally中的return值替換掉try中的return值 */
四,throw & throws
throw : 將產生的異常拋出(強調的是動作),拋出的既可以是異常的引用,也可以是異常對象。(位置: 方法體內)
throws : 如果一個方法可能會出現異常,但沒有能力處理這種異常,可以在方法聲明處用throws子句來聲明拋出異常。用它修飾的方法向調用者表明該方法可能會拋出異常(可以是一種類型,也可以是多種類型,用逗號隔開)(位置: 寫在方法名 或方法名列表之後 ,在方法體之前。)
五,自定義異常
可以繼承Exception或Throwable類來定義自己的異常類型
public class MyException extends Exception{
public MyException() {
}
public MyException(String msg) {
super(msg);
}
}
異常拋出方法和自帶異常一樣,如下
public int exceptionTest(int a) throws MyException {
if(a<10) {
System.out.println("程序正常");
return a;
}
else {
throw new MyException("程序異常");
}
}
以及捕獲異常如下
public static void main(String[] args) {
Main m=new Main();
try {
int res=m.exceptionTest(11);
} catch (MyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
JAVA-Exception&Error