Java中采用了強(qiáng)制異常捕捉機(jī)制与帆,這樣一方面提高了程序的可靠性,不過有時候也帶來一些麻煩鄙漏。比如:
int i= Integer.parseInt("33");
這個我知道它不可能會拋出異常划纽,但是不捕捉異常的話就過不了編譯這關(guān),當(dāng)然這個代碼沒有意義的蟀给。
Java中所有異常或者錯誤都繼承Throwable阳堕,我們把它分為三類吧:
1.Error:所有都繼承自Error跋理,表示致命的錯誤,比如內(nèi)存不夠恬总,字節(jié)碼不合法等前普。
2.Exception:這個屬于應(yīng)用程序級別的異常,這類異常必須捕捉壹堰。
3.RuntimeException:奇怪RuntimeException繼承了Exception拭卿,而不是直接繼Error,??這個表示系統(tǒng)異常贱纠,比較嚴(yán)重峻厚。
Error我們很少遇到,但是并不是說Error就一定非常致命并巍,舉個例子目木,NoSuchMethodError表示沒有這個方法,你調(diào)用的方法不存在懊渡,你一定覺得奇怪,不存在怎么編譯的過去呀军拟?很簡單的剃执,你先編譯好一個被調(diào)用的類A,給一個方法懈息。然后在你的程序調(diào)用它肾档,編譯沒問題,運(yùn)行也沒問題。現(xiàn)在再把A類中這個方法去掉怒见,重新編譯一遍俗慈,你再運(yùn)行你的程序就知道錯誤是怎么回事了。
Exception不用說遣耍,我們要自己捕捉闺阱。
RuntimeException可以說見的最多了,下面我們說明一下常見的RuntimeException:
1)NullPointerException:見的最多了舵变,其實很簡單酣溃,一般都是在null對象上調(diào)用方法了。
String s=null;
boolean eq=s.equals(""); // NullPointerException
這里你看的非常明白了纪隙,為什么一到程序中就暈?zāi)兀?br>
public int getNumber(String str){
if(str.equals("A"))?return?1;
else?if(str.equals("B"))?return?2;
}
這個方法就有可能拋出NullPointerException,我建議你主動拋出異常赊豌,因為代碼一多,你可能又暈了绵咱。
public?int?getNumber(String?str){
if(str==null)?throw?new?NullPointerException("參數(shù)不能為空");
if(str.equals("A"))?return?1;
else?if(str.equals("B"))?return?2;
}
2)NumberFormatException:繼承IllegalArgumentException碘饼,字符串轉(zhuǎn)換為數(shù)字時。
比如:
int?i=?Integer.parseInt("ab3");
3)ArrayIndexOutOfBoundsException:數(shù)組越界
比如:
?int[]?a=new?int[3];
?int?b=a[3];
4)StringIndexOutOfBoundsException:字符串越界
比如 :
String?s="hello";?
char?c=s.charAt(6);
5)ClassCastException:類型轉(zhuǎn)換錯誤
比如 :
Object?obj=new?Object();?
String?s=(String)obj;
6)UnsupportedOperationException:該操作不被支持悲伶。
如果我們希望不支持這個方法派昧,可以拋出這個異常。既然不支持還要這個干嗎拢切?有可能子類中不想支持父類中有的方法蒂萎,可以直接拋出這個異常。
7)ArithmeticException:算術(shù)錯誤淮椰,典型的就是0作為除數(shù)的時候五慈。
8)IllegalArgumentException:非法參數(shù),在把字符串轉(zhuǎn)換成數(shù)字的時候經(jīng)常出現(xiàn)的一個異常主穗,我們可以在自己的程序中好好利用這個異常泻拦。
這些異常一看到名字就知道是怎么回事了,其實只要理解了java的異常處理機(jī)制忽媒,這些都不是問題争拐。