java运行时异常的特点是什么_Java运行时异常和非运行时异常
1.Java異常機(jī)制
Java把異常當(dāng)做對(duì)象來處理,并定義一個(gè)基類java.lang.Throwable作為所有異常的超類。Java中的異常分為兩大類:錯(cuò)誤Error和異常Exception,Java異常體系結(jié)構(gòu)如下圖所示:
2.Throwable
Throwable類是所有異常或錯(cuò)誤的超類,它有兩個(gè)子類:Error和Exception,分別表示錯(cuò)誤和異常。其中異常Exception分為運(yùn)行時(shí)異常(RuntimeException)和非運(yùn)行時(shí)異常,也稱之為不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)。
3.Error
一般是指java虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰、虛擬機(jī)出錯(cuò)誤、動(dòng)態(tài)鏈接失敗等,這種錯(cuò)誤無法恢復(fù)或不可能捕獲,將導(dǎo)致應(yīng)用程序中斷,通常應(yīng)用程序無法處理這些錯(cuò)誤,因此應(yīng)用程序不應(yīng)該捕獲Error對(duì)象,也無須在其throws子句中聲明該方法拋出任何Error或其子類。
4.可查異常和不可查異常
通常,Java的異常(包括Exception和Error)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。
可查異常(編譯器要求必須處置的異常):正確的程序在運(yùn)行中,很容易出現(xiàn)的、情理可容的異常狀況。可查異常雖然是異常狀況,但在一定程度上它的發(fā)生是可以預(yù)計(jì)的,而且一旦發(fā)生這種異常狀況,就必須采取某種方式進(jìn)行處理。
除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點(diǎn)是Java編譯器會(huì)檢查它,也就是說,當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語句捕獲它,要么用throws子句聲明拋出它,否則編譯不會(huì)通過。
不可查異常(編譯器不要求強(qiáng)制處置的異常):包括運(yùn)行時(shí)異常(RuntimeException與其子類)和錯(cuò)誤(Error)。
如果使用throw在方法體中拋出可查異常,則需要在方法頭部聲明方法可能拋出的異常類型。程序會(huì)在throw語句后立即終止,它后面的語句執(zhí)行不到,然后在包含它的所有try塊中(可能在上層調(diào)用函數(shù)中)從里向外尋找含有與其匹配的catch子句的try塊。
5.運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常
(1)運(yùn)行時(shí)異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。
當(dāng)出現(xiàn)RuntimeException的時(shí)候,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時(shí),總是由虛擬機(jī)接管。比如:我們從來沒有人去處理過NullPointerException異常,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見的異常之一。
出現(xiàn)運(yùn)行時(shí)異常后,如果沒有捕獲處理這個(gè)異常(即沒有catch),系統(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í)異常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須捕獲所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,然后記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理。
(2)非運(yùn)行時(shí)異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。如IOException、SQLException等以及用戶自定義的Exception異常。對(duì)于這種異常,JAVA編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行catch并處理,否則程序就不能編譯通過。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。
6.finally關(guān)鍵字
來看看下面這個(gè)test1()方法:
public inttest1() {try{return 1;
}finally{return 2;
}
}
方法test1將返回2;
怎么解釋呢?再來看看下面這個(gè)test2()方法:
public inttest2() {int i = 1;try{
System.out.println("try語句塊中");return 1;
}finally{
System.out.println("finally語句塊中");return 2;
}
}
運(yùn)行結(jié)果是:
try語句塊中
finally語句塊中
2
從運(yùn)行結(jié)果中可以發(fā)現(xiàn),try中的return語句調(diào)用的函數(shù)先于finally中調(diào)用的函數(shù)執(zhí)行,也就是說return語句先執(zhí)行,finally語句后執(zhí)行,所以,返回的結(jié)果是2。return并不是讓函數(shù)馬上返回,而是return語句執(zhí)行后,將把返回結(jié)果放置進(jìn)函數(shù)棧中,此時(shí)函數(shù)并不是馬上返回,它要執(zhí)行finally語句后才真正開始返回。
常見RuntimeException:
ArrayStoreException ? ? ? ? ? ? ? ?試圖將錯(cuò)誤類型的對(duì)象存儲(chǔ)到一個(gè)對(duì)象數(shù)組時(shí)拋出的異常
ClassCastException ? ? ? ? ? ? ? ?試圖將對(duì)象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類時(shí),拋出該異常
IllegalArgumentException ? ? ? ? 拋出的異常表明向方法傳遞了一個(gè)不合法或不正確的參數(shù)
IndexOutOfBoundsException ? 指示某排序索引(例如對(duì)數(shù)組、字符串或向量的排序)超出范圍時(shí)拋出
NoSuchElementException ? ? ? 表明枚舉中沒有更多的元素
NullPointerException ? ? ? ? ? ? ? ?當(dāng)應(yīng)用程序試圖在需要對(duì)象的地方使用 null 時(shí),拋出該異常
java.io.NotSerializableException 表明序列化或反序列化時(shí)出錯(cuò)
java.util.ConcurrentModificationException 集合遍歷快速失敗
總結(jié)
以上是生活随笔為你收集整理的java运行时异常的特点是什么_Java运行时异常和非运行时异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存超频攻略:选对内存条,调整BIOS,
- 下一篇: 内存颜色大揭秘:为何fury成为热门选择