面试常见java异常题_Java异常面试题(含答案)
1、Java中異常分為哪兩種?
編譯時(shí)異常
運(yùn)行時(shí)異常
2、異常的處理機(jī)制有幾種?
異常捕捉:try…catch…finally,異常拋出:throws。
3、如何自定義一個(gè)異常
繼承一個(gè)異常類,通常是RumtimeException或者Exception
4、try catch fifinally,try里有return,finally還執(zhí)行么?
執(zhí)行,并且finally的執(zhí)行早于try里面的return
結(jié)論:
1.不管有木有出現(xiàn)異常,finally塊中代碼都會(huì)執(zhí)行;
2.當(dāng)try和catch中有return時(shí),finally仍然會(huì)執(zhí)行;
3.finally是在return后面的表達(dá)式運(yùn)算后執(zhí)行的(此時(shí)并沒有返回運(yùn)算后的值,而是先把要返回的值保存起來,管finally中的代碼怎么樣,返回的值都不會(huì)改變,任然是之前保存的值),所以函數(shù)返回值是在finally執(zhí)行前確定的;
4.finally中最好不要包含return,否則程序會(huì)提前退出,返回值不是try或catch中保存的返回值。
5、 Excption與Error包結(jié)構(gòu)
Java可拋出(Throwable)的結(jié)構(gòu)分為三種類型:被檢查的異常(CheckedException),運(yùn)行時(shí)異常
(RuntimeException),錯(cuò)誤(Error)。
1.運(yùn)行時(shí)異常
定義:RuntimeException及其子類都被稱為運(yùn)行時(shí)異常。
特點(diǎn):Java編譯器不會(huì)檢查它。也就是說,當(dāng)程序中可能出現(xiàn)這類異常時(shí),倘若既"沒有通過throws聲明拋出它",也"沒有用try-catch語句捕獲它",還是會(huì)編譯通過。例如,除數(shù)為零時(shí)產(chǎn)生的ArithmeticException異常,數(shù)組越界時(shí)產(chǎn)生的IndexOutOfBoundsException異常,failfast機(jī)制產(chǎn)生的ConcurrentModi?cationException異常(java.util包下面的所有的集合類都是快速失敗的,“快速失敗”也就是fail-fast,它是Java集合的一種錯(cuò)誤檢測(cè)機(jī)制。當(dāng)多個(gè)線程對(duì)集合進(jìn)行結(jié)構(gòu)上的改變的操作時(shí),有可能會(huì)產(chǎn)生fail-fast機(jī)制。記住是有可能,而不是一定。
例如:假設(shè)存在兩個(gè)線程(線程1、線程2),線程1通過Iterator在遍歷集合A中的元素,在某個(gè)時(shí)候線程2修改了集合A的結(jié)構(gòu)(是結(jié)構(gòu)上面的修改,而不是簡單的修改集合元素的內(nèi)容),那么這個(gè)時(shí)候程序就會(huì)拋出ConcurrentModi?cationException異常,從而產(chǎn)生fail-fast機(jī)制,這個(gè)錯(cuò)叫并發(fā)修改異常。Fail-safe,java.util.concurrent包下面的所有的類都是安全失敗的,在遍歷過程中,如果已經(jīng)遍歷的數(shù)組上的內(nèi)容變化了,迭代器不會(huì)拋出
ConcurrentModi?cationException異常。如果未遍歷的數(shù)組上的內(nèi)容發(fā)生了變化,則有可能反映到迭代過程中。這就是ConcurrentHashMap迭代器弱一致的表現(xiàn)。ConcurrentHashMap的弱一致性主要是為了提升效率,是一致性與效率之間的一種權(quán)衡。要成為強(qiáng)一致性,就得到處使用鎖,甚至是全局鎖,這就與Hashtable和同步的HashMap一樣了。)等,都屬于運(yùn)行時(shí)異常。
常見的五種運(yùn)行時(shí)異常:
ClassCastException(類轉(zhuǎn)換異常)
IndexOutOfBoundsException(數(shù)組越界)
NullPointerException(空指針異常)
ArrayStoreException(數(shù)據(jù)存儲(chǔ)異常,操作數(shù)組是類型不一致)
Bu?erOver?owException
2.被檢查異常
定義:Exception類本身,以及Exception的子類中除了"運(yùn)行時(shí)異常"之外的其它子類都屬于被檢查異常。特點(diǎn) : Java編譯器會(huì)檢查它。此類異常,要么通過throws進(jìn)行聲明拋出,要么通過try-catch進(jìn)行捕獲處理,否則不能通過編譯。例如,CloneNotSupportedException就屬于被
檢查異常。當(dāng)通過clone()接口去克隆一個(gè)對(duì)象,而該對(duì)象對(duì)應(yīng)的類沒有實(shí)現(xiàn)Cloneable接口,就會(huì)拋出CloneNotSupportedException異常。被檢查異常通常都是可以恢復(fù)的。
如:
IOException
FileNotFoundException
SQLException
被檢查的異常適用于那些不是因程序引起的錯(cuò)誤情況,比如:讀取文件時(shí)文件不存在引發(fā)的FileNotFoundException 。然而,不被檢查的異
常通常都是由于糟糕的編程引起的,比如:在對(duì)象引用時(shí)沒有確保對(duì)象非空而引起的 NullPointerException 。
3.錯(cuò)誤
定義 : Error類及其子類。
特點(diǎn) : 和運(yùn)行時(shí)異常一樣,編譯器也不會(huì)對(duì)錯(cuò)誤進(jìn)行檢查。當(dāng)資源不足、約束失敗、或是其它程序無法繼續(xù)運(yùn)行的條件發(fā)生時(shí),就產(chǎn)生錯(cuò)誤。程序本身無法修復(fù)這些錯(cuò)誤的。例如,VirtualMachineError就屬于錯(cuò)誤。出現(xiàn)這種錯(cuò)誤會(huì)導(dǎo)致程序終止運(yùn)行。OutOfMemoryError、ThreadDeath。
Java虛擬機(jī)規(guī)范規(guī)定JVM的內(nèi)存分為了好幾塊,比如堆,棧,程序計(jì)數(shù)器,方法區(qū)等
6、Thow與thorws區(qū)別
位置不同
throws 用在函數(shù)上,后面跟的是異常類,可以跟多個(gè);而 throw 用在函數(shù)內(nèi),后面跟的
是異常對(duì)象。
功能不同
2. throws 用來聲明異常,讓調(diào)用者只知道該功能可能出現(xiàn)的問題,可以給出預(yù)先的處理方
式;throw 拋出具體的問題對(duì)象,執(zhí)行到 throw,功能就已經(jīng)結(jié)束了,跳轉(zhuǎn)到調(diào)用者,并
將具體的問題對(duì)象拋給調(diào)用者。也就是說 throw 語句獨(dú)立存在時(shí),下面不要定義其他語
句,因?yàn)閳?zhí)行不到。
3. throws 表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這些異常;throw 則是拋出了異常,
執(zhí)行 throw 則一定拋出了某種異常對(duì)象。
4. 兩者都是消極處理異常的方式,只是拋出或者可能拋出異常,但是不會(huì)由函數(shù)去處理異
常,真正的處理異常由函數(shù)的上層調(diào)用處理。
7、Error與Exception區(qū)別?
Error和Exception都是java錯(cuò)誤處理機(jī)制的一部分,都繼承了Throwable類。
Exception表示的異常,異常可以通過程序來捕捉,或者優(yōu)化程序來避免。
Error表示的是系統(tǒng)錯(cuò)誤,不能通過程序來進(jìn)行錯(cuò)誤處理。
8、error和exception有什么區(qū)別
error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況 exception 表示一種設(shè)
計(jì)或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。
面試題不斷更新,歡迎關(guān)注微信公眾號(hào)【慕容千語】
總結(jié)
以上是生活随笔為你收集整理的面试常见java异常题_Java异常面试题(含答案)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql子查询字符串位置_MySql基
- 下一篇: java io文件操作_java IO