Throwable-->Exception/Error
Exception除了runtimeException及其子類都是可檢測(cè)異常
受檢測(cè)異常:如果編譯器檢測(cè)到可能拋出該類異常友扰,就必須在方法或者構(gòu)造方法中聲明進(jìn)行try...catch或throws,如果catch語(yǔ)句沒(méi)有捕獲,JVM還是會(huì)拋出異常莱坎。否則無(wú)法通過(guò)編譯治泥,常見(jiàn)的受監(jiān)測(cè)異常有IO操作先煎、ClassNotFoundException裸燎、線程操作
不受檢測(cè)異常(運(yùn)行時(shí)異常):沒(méi)有上述限制蚁滋,不過(guò)想聲明捕獲也可以冯事,常見(jiàn)的有NullPointExecrption焦匈、NumberFormatException(字符串轉(zhuǎn)換為數(shù)字)、ArrayIndexOutOfBoundsException(數(shù)組越界)昵仅、ClassCastException(類型轉(zhuǎn)換錯(cuò)誤)缓熟、ArithmeticException(算術(shù)錯(cuò)誤)等。
Error: An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch 編譯時(shí)或系統(tǒng)錯(cuò)誤摔笤,一般無(wú)法恢復(fù)或者不可捕獲荚虚,將導(dǎo)致應(yīng)用程序中斷, 通常應(yīng)用程序無(wú)法處理這些錯(cuò)誤。但可以聲明捕獲籍茧,如果不能被處理的話就顯得多余版述,因?yàn)樵擃惍惓J窃凇罢l件”下發(fā)生的,Java 程序通常不捕獲Error寞冯。
public void show() {
try {
System.out.println("pdd");
pdd();
}catch (StackOverflowError error){
System.out.println("pdd dead");
}finally {
System.out.println("after death");
}
System.out.println("pdd still here");
}
public void pdd(){
pdd();
}
//pdd still here也會(huì)被打印,但上面說(shuō)了不建議catch Error
try{}catch{}finally{}中的操作
如果是程序主動(dòng)上拋異常而不捕獲渴析,那么上拋異常下面的代碼將不能執(zhí)行。
finally子句一定會(huì)執(zhí)行(即使exception或者Error沒(méi)有被捕獲)吮龄。如果在finally語(yǔ)句塊中拋出了一個(gè)異常俭茧,就會(huì)終止finally語(yǔ)句塊中下方語(yǔ)句執(zhí)行,同時(shí)將try/catch語(yǔ)句中拋出的異常覆蓋漓帚。
關(guān)于異常的繼承
java繼承鏈中母债,如果在拋出函數(shù)聲明中子類聲明拋出的異常只能是父類聲明的異常或其子異常尝抖,或者不聲明拋出異常毡们。父類函數(shù)中如果只拋出了檢查性異常,則子類中還可以聲明拋出非檢查性異常昧辽。但如果父類中只聲明拋出了非檢查性異常衙熔,子類中只能拋出非檢查性異常。
class A {
public void fun() throws Exception {}
}
class B extends A {
public void fun() throws IOException, RuntimeException {
}
}
子類在重寫父類拋出異常的方法時(shí)搅荞,如果實(shí)現(xiàn)了有相同方法簽名的接口且接口中的該方法也有異常聲明红氯,則子類重寫的方法要么不拋出異常框咙,要么拋出父類中被重寫方法聲明異常與接口中被實(shí)現(xiàn)方法聲明異常的交集。
class Test {
public Test() throws IOException {}
void test() throws IOException {}
}
interface I1{
void test() throw Exception;
}
class SubTest extends Test implements I1 {
public SubTest() throws Exception,NullPointerException, NoSuchMethodException {}
void test() throws IOException {}
}
參考文章:
https://juejin.im/post/5b6d61e55188251b38129f9a#heading-0