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