寫(xiě)java程序時(shí),通常會(huì)被提示捕獲異常,而又有一些異常是不需要強(qiáng)制捕獲的,這是一個(gè)被說(shuō)爛了的話題。像我一樣從其他語(yǔ)言轉(zhuǎn)過(guò)來(lái)的人確實(shí)有點(diǎn)迷惑,那我以我的理解重新解釋一遍吧。
異常的基類是Exception,Exception子類有RuntimeException和其它Exception。這些其它的Exception叫做Checked異常,RuntimeException叫做Unchecked異常。
只看名字不太好理解,說(shuō)的通俗點(diǎn),java為了程序能夠穩(wěn)定的運(yùn)行,就提示開(kāi)發(fā)者捕獲已知異常。編譯器知道所有類型或方法可能拋出的異常,在你使用某種類型或方法時(shí),編譯器就會(huì)提示你捕獲已知的異常。這些編譯器已知的可能存在的異常就是Checked異常。例如你在關(guān)閉文件流時(shí),IOException已經(jīng)在close方法里寫(xiě)明可能拋出,那么編譯器就提示你必須捕獲異常。而RuntimeException異常在編譯階段是不知道的,只有運(yùn)行階段才能確定,比如3/0(3除以0)會(huì)報(bào)ArithmeticException異常。因?yàn)檫@個(gè)除數(shù)是運(yùn)行階段可以變化的,所以不提示捕獲。這些RuntimeException就是Unchecked異常。
總之java是盡可能的讓程序穩(wěn)定,知道的就提示你,不知道的就無(wú)能為力了。這樣解釋?xiě)?yīng)該比較清晰了吧。
下邊要進(jìn)入正題了。
可能有些朋友在調(diào)試程序時(shí)遇到過(guò)這種情況,程序明明出現(xiàn)了異常,也catch(Exception e)了,卻沒(méi)有捕獲到任何信息。原因無(wú)非有兩個(gè),1.異常所在的線程跟你捕獲的線程不是同一個(gè)線程,2.程序拋出的不是Exception而是Error。Error跟Exception一樣都繼承自Throwable,是指不應(yīng)該被捕獲的嚴(yán)重錯(cuò)誤。當(dāng)時(shí)看到這個(gè)解釋,我竟然傻逼到?jīng)]想明白為什么不該捕獲Error。因?yàn)槌霈F(xiàn)Error的情況會(huì)造成程序直接無(wú)法運(yùn)行,所以捕獲了也沒(méi)有任何意義。那我的問(wèn)題又來(lái)了,如果不捕獲,那程序出問(wèn)題退出了,連log都看不見(jiàn),我該怎么辦?其實(shí)這個(gè)假設(shè)是不成立的,因?yàn)槿绻鸈rror真的存在,你在開(kāi)發(fā)環(huán)境就已經(jīng)發(fā)現(xiàn)問(wèn)題了,根本不可能發(fā)布到正式環(huán)境。
唉,繞了一大圈搞了這么件傻逼事,所以不要再討論Error該不該被捕獲了!
本人學(xué)識(shí)尚淺,寫(xiě)文目的是為了得到大家指點(diǎn)。倘若文章幫到了您,那真是好極了。