主要兩類異常:
檢查性異常:也就是我們經(jīng)常遇到的IO異常端逼,以及SQL異常都是這種異常揖铜。對(duì)于這種異常,JAVA編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行catch困介。所以,面對(duì)這種異常不管我們是否愿意穷吮,只能自己去寫一大堆catch塊去處理可能的異常。
運(yùn)行時(shí)異常:我們可以不處理饥努。當(dāng)出現(xiàn)這樣的異常時(shí)捡鱼,總是由虛擬機(jī)接管。比如:我們從來(lái)沒有人去處理過NullPointerException異常酷愧,它就是運(yùn)行時(shí)異常驾诈,并且這種異常還是最常見的異常之一。
出現(xiàn)運(yùn)行時(shí)異常后溶浴,系統(tǒng)會(huì)把異常一直往上層拋乍迄,一直遇到處理代碼。如果沒有處理塊士败,到最上層闯两,如果是多線程就由Thread.run()拋出,如果是單線程就被main()拋出谅将。拋出之后漾狼,如果是線程,這個(gè)線程也就退出了饥臂。如果是主程序拋出的異常逊躁,那么這整個(gè)程序也就退出了。運(yùn)行時(shí)異常是Exception的子類隅熙,也有一般異常的特點(diǎn)稽煤,是可以被Catch塊處理的。只不過往往我們不對(duì)他處理罷了囚戚。也就是說酵熙,你如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后驰坊,要么是線程中止绿店,要么是主程序終止。
錯(cuò)誤 error:錯(cuò)誤不是異常,Error 用來(lái)指示運(yùn)行時(shí)環(huán)境發(fā)生的錯(cuò)誤假勿。
Exception 類的層次
Java 內(nèi)置異常類
?Java 的非檢查性異常
檢查性異常類
異常方法
?Throwable 類的主要方法:
捕獲異常
try
? ? {
? ? ? ? // 程序代碼
? ? }catch(ExceptionName e1)
? ? {
? ? ? ? //Catch 塊
? ? }
Catch 語(yǔ)句包含要捕獲異常類型的聲明借嗽。當(dāng)保護(hù)代碼塊中發(fā)生一個(gè)異常時(shí),try 后面的 catch 塊就會(huì)被檢查转培。如果發(fā)生的異常包含在 catch 塊中恶导,異常會(huì)被傳遞到該 catch 塊
多重捕獲塊?
finally關(guān)鍵字
try{
? // 程序代碼
}catch(異常類型1 異常的變量名1){
? // 程序代碼
}catch(異常類型2 異常的變量名2){
? // 程序代碼
} finally{
? // 程序代碼
}
上面的代碼段包含了 3 個(gè) catch塊。
可以在 try 語(yǔ)句后面添加任意數(shù)量的 catch 塊浸须。
如果保護(hù)代碼中發(fā)生異常惨寿,異常被拋給第一個(gè) catch 塊。
如果拋出異常的數(shù)據(jù)類型與 ExceptionType1 匹配删窒,它在這里就會(huì)被捕獲裂垦。
如果不匹配,它會(huì)被傳遞給第二個(gè) catch 塊肌索。
如此蕉拢,直到異常被捕獲或者通過所有的 catch 塊。
finally 關(guān)鍵字用來(lái)創(chuàng)建在 try 代碼塊后面執(zhí)行的代碼塊诚亚。
無(wú)論是否發(fā)生異常晕换,finally 代碼塊中的代碼總會(huì)被執(zhí)行。
throws/throw 關(guān)鍵字:?
如果一個(gè)方法沒有捕獲到一個(gè)檢查性異常站宗,那么該方法必須使用 throws 關(guān)鍵字來(lái)聲明闸准。throws 關(guān)鍵字放在方法簽名的尾部。
也可以使用 throw 關(guān)鍵字拋出一個(gè)異常梢灭,無(wú)論它是新實(shí)例化的還是剛捕獲到的夷家。
一個(gè)方法可以聲明拋出多個(gè)異常,多個(gè)異常之間用逗號(hào)隔開敏释。
import java.io.*;
public class className
{
? public void deposit(double amount) throws RemoteException,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? InsufficientFundsException
? {
? ? // Method implementation
? ? throw new RemoteException();
? }
? //Remainder of class definition
}
聲明自定義異常
如果希望寫一個(gè)檢查性異常類瘾英,則需要繼承 Exception 類。
如果你想寫一個(gè)運(yùn)行時(shí)異常類颂暇,那么需要繼承 RuntimeException 類缺谴。
class MyException extends Exception{
}
實(shí)例參考? 菜鳥教程Java異常