解析java中的error該不該捕獲
寫java程序時,通常會被提示捕獲異常,而又有一些異常是不需要強制捕獲的,這是一個被說爛了的話題。像我一樣從其他語言轉(zhuǎn)過來的人確實有點迷惑,那我以我的理解重新解釋一遍吧。
異常的基類是Exception,Exception子類有RuntimeException和其它Exception。這些其它的Exception叫做Checked異常,RuntimeException叫做Unchecked異常。
只看名字不太好理解,說的通俗點,java為了程序能夠穩(wěn)定的運行,就提示開發(fā)者捕獲已知異常。編譯器知道所有類型或方法可能拋出的異常,在你使用某種類型或方法時,編譯器就會提示你捕獲已知的異常。這些編譯器已知的可能存在的異常就是Checked異常。例如你在關(guān)閉文件流時,IOException已經(jīng)在close方法里寫明可能拋出,那么編譯器就提示你必須捕獲異常。而RuntimeException異常在編譯階段是不知道的,只有運行階段才能確定,比如3/0(3除以0)會報ArithmeticException異常。因為這個除數(shù)是運行階段可以變化的,所以不提示捕獲。這些RuntimeException就是Unchecked異常。
總之java是盡可能的讓程序穩(wěn)定,知道的就提示你,不知道的就無能為力了。這樣解釋應(yīng)該比較清晰了吧。
下邊要進入正題了。
可能有些朋友在調(diào)試程序時遇到過這種情況,程序明明出現(xiàn)了異常,也catch(Exception e)了,卻沒有捕獲到任何信息。原因無非有兩個,1.異常所在的線程跟你捕獲的線程不是同一個線程,2.程序拋出的不是Exception而是Error。Error跟Exception一樣都繼承自Throwable,是指不應(yīng)該被捕獲的嚴(yán)重錯誤。當(dāng)時看到這個解釋,我竟然沒想明白為什么不該捕獲Error。因為出現(xiàn)Error的情況會造成程序直接無法運行,所以捕獲了也沒有任何意義。那我的問題又來了,如果不捕獲,那程序出問題退出了,連log都看不見,我該怎么辦?其實這個假設(shè)是不成立的,因為如果Error真的存在,你在開發(fā)環(huán)境就已經(jīng)發(fā)現(xiàn)問題了,根本不可能發(fā)布到正式環(huán)境?! ?/p>
本人學(xué)識尚淺,寫文目的是為了得到大家指點。倘若文章幫到了您,那真是好極了。
相關(guān)文章
SpringBoot整合Quartz實現(xiàn)定時任務(wù)詳解
這篇文章主要介紹了Java?任務(wù)調(diào)度框架?Quartz,Quartz是OpenSymphony開源組織在Job?scheduling領(lǐng)域又一個開源項目,完全由Java開發(fā),可以用來執(zhí)行定時任務(wù),類似于java.util.Timer。,下面我們來學(xué)習(xí)一下關(guān)于?Quartz更多的詳細(xì)內(nèi)容,需要的朋友可以參考一下2022-08-08springboot如何添加task任務(wù)執(zhí)行隊列
這篇文章主要介紹了springboot如何添加task任務(wù)執(zhí)行隊列問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot + minio實現(xiàn)分片上傳、秒傳、續(xù)傳功能
MinIO是一個基于Go實現(xiàn)的高性能、兼容S3協(xié)議的對象存儲,使用MinIO構(gòu)建用于機器學(xué)習(xí),分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載的高性能基礎(chǔ)架構(gòu),這篇文章主要介紹了SpringBoot + minio實現(xiàn)分片上傳、秒傳、續(xù)傳,需要的朋友可以參考下2023-06-06