mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?
難度
初級
學(xué)習(xí)時間
30分鐘
適合人群
零基礎(chǔ)
開發(fā)語言
Java
開發(fā)環(huán)境
- JDK v11
- IntelliJ IDEA v2018.3
友情提示
- 本教學(xué)屬于系列教學(xué),內(nèi)容具有連貫性,本章使用到的內(nèi)容之前教學(xué)中都有詳細(xì)講解。
- 本章內(nèi)容針對零基礎(chǔ)或基礎(chǔ)較差的同學(xué)比較友好,可能對于有基礎(chǔ)的同學(xué)來說很簡單,希望大家可以根據(jù)自己的實際情況選擇繼續(xù)看完或等待看下一篇文章。謝謝大家的諒解!
1.異常體系
在Java異常這個大家族中,Throwable是這個異常家族中的老大,它下面有兩個靠譜老弟,一個叫“Error”,一個叫“Exception”。Error老弟負(fù)責(zé)錯誤部門,Exception老弟負(fù)責(zé)異常部門,它們各司其職。我給它們做了一個結(jié)構(gòu)圖:
Throwable在上一章《“全棧2019”Java異常第十六章:Throwable詳解》中已經(jīng)介紹過了,而Exception我們已經(jīng)不陌生了,前面文章都和Exception有關(guān),Error我們比較陌生一點,這一章章我們就著重講解它。
2.已檢查的異常
在上一章中,我們知道出于編譯時檢查異常的目的,Throwable和Throwable的任何子類(除Error和RuntimeException的子類)都被視為已檢查的異常。
Error不是已檢查的異常,那Error是什么呢?
Error是錯誤。
在Java異常體系中有三種異常:
第一種異常是已檢查的異常。
第二種異常是錯誤。
第三種異常是運行時異常。
已檢查的異常在上一章已經(jīng)聊過了,現(xiàn)在我們來聊聊錯誤。運行時異常放在Exception的下一章講解。
3.錯誤
Error是Throwable的子類,表示合理的應(yīng)用程序不應(yīng)該嘗試捕獲的嚴(yán)重問題。當(dāng)錯誤發(fā)生時,這些錯誤應(yīng)該是無法預(yù)測或恢復(fù)的(try-catch或throws)。
當(dāng)我們遇到Error時,我們不應(yīng)該去使用try-catch捕獲它,也不應(yīng)該throws將錯誤拋出去。
那該如何是好?
我們應(yīng)該手動排查錯誤出現(xiàn)的原因及位置,然后把它解決在程序運行之前。
這里有一點非常重要,“當(dāng)我們遇到Error時,我們不應(yīng)該去使用try-catch捕獲它,也不應(yīng)該throws將錯誤拋出去。”說的都是不應(yīng)該,不是說不能。我們還是可以使用try-catch或throws,只是不應(yīng)該這樣去做。
通俗來講就是,異常就像電腦打開某個軟件,然后軟件因為某個操作而崩潰了,這時你可以再重新打開一次軟件,這就相當(dāng)于捕獲異常的操作修復(fù)好這個問題了;而錯誤就不一樣,錯誤就像你電腦冒煙了,這時你肯定是修不好了,也就相當(dāng)于你無法捕獲這個錯誤去修復(fù)它。當(dāng)然了,有小伙伴說電腦冒煙我能不能修復(fù)的試試?當(dāng)然可以,這就和我們程序中遇到Error時,可以使用try-catch或者thorws,但是不建議你這么做。
我們來結(jié)合例子看看。
演示:
請拋出一個錯誤。
請觀察程序代碼及結(jié)果。
代碼:
Main類:
結(jié)果:
從運行結(jié)果來看,Error不是不能被try-catch的,而且不光可以try-catch程序還被修復(fù)好了,從運行結(jié)果我們就可以看出來:
那么我們程序本身做了什么呢?
首先,我們拋出一個Error對象,用來模擬制造一個錯誤:
緊接著,我們對其進(jìn)行try-catch處理:
在catch中我們打印Error的堆棧跟蹤信息:
在try-catch的下面我們輸出了一段話,這行代碼的作用只有一個,那就是驗證我們的錯誤是被成功修復(fù)的:
程序執(zhí)行結(jié)果也符合預(yù)期:
可能小伙伴們說,這例子也太技術(shù)含量了吧,是不是有點太敷衍我們了?
這個例子僅僅只是演示Error可以被try-catch,下面我們來一個實際開發(fā)中的案例,而且這個錯誤是日常開發(fā)中偶爾會碰到的。
4.內(nèi)存溢出OutOfMemoryError
OutOfMemoryError對于大多數(shù)零基礎(chǔ)的同學(xué)來說,可能比較陌生,但是對于稍微有些開發(fā)經(jīng)驗的同學(xué)來說,也算是打過幾次照面的。
OutOfMemoryError是什么?
OutOfMemoryError是內(nèi)存溢出錯誤。
OutOfMemoryError什么時候會發(fā)生?
OutOfMemoryError在JVM(Java虛擬機)內(nèi)存不足的情況下會發(fā)生。
大家還記得我們在講解《“全棧2019”Java異常第十三章:訪問異常堆棧跟蹤信息》一章中講到的JVM內(nèi)存圖嗎?里面我們講到JVM會去申請一塊內(nèi)存空間,這塊內(nèi)存空間專門是用來存放Java應(yīng)用數(shù)據(jù)的(比如基本數(shù)據(jù)類型、數(shù)組、對象...等等)。當(dāng)這塊內(nèi)存空間不足的時候,就會發(fā)生OutOfMemoryError異常。
來個例子演示一下。
演示:
請制造一個OutOfMemoryError異常。
請觀察程序代碼及結(jié)果。
代碼:
Main類:
結(jié)果:
從運行結(jié)果來看,我們程序的確是發(fā)生了OutOfMemoryError異常。接下來,我們看看它是怎么發(fā)生的。
程序代碼真的是好簡單,就一行:
我們創(chuàng)建了一個int類型的數(shù)組,只不過就是數(shù)組長度有點大,1024 * 1024 * 1024個長度。
為什么這一行代碼會產(chǎn)生OutOfMemoryError異常,讓JVM內(nèi)存溢出?
因為我們在創(chuàng)建數(shù)組的時候,實際上就是在申請一塊內(nèi)存空間用,這個內(nèi)存空間就是數(shù)組的地盤,而且數(shù)組在申請內(nèi)存空間的時候,還會按照數(shù)據(jù)類型的大小來預(yù)支實際內(nèi)存大小,我們知道一個int占4個字節(jié),我們申請了1024 * 1024 * 1024個int這么多的4個字節(jié),可想而知內(nèi)存申請有多大,所以創(chuàng)建一個長度超出JVM內(nèi)存大小的數(shù)組時,就會產(chǎn)生OutOfMemoryError異常。
有的小伙伴的JVM內(nèi)存可能有足夠大,所以當(dāng)他運行和我一摸一摸的程序時,程序并沒有崩潰,那么請這樣的小伙伴再在數(shù)組長度的后面乘以1024。
為什么是1024?
因為1024在程序計算中容易換算,比如1KB=1024B(B:字節(jié))。
像OutOfMemoryError我們就必要去捕獲它了,真發(fā)生了OutOfMemoryError程序就只能是崩潰之后重新運行。
為什么沒必要?
我們不知道它會什么時候出現(xiàn),實際開發(fā)不像我們上面這樣去寫一個長度超出JVM內(nèi)存大小的數(shù)組,內(nèi)存的申請發(fā)生在每一行代碼身上,我不知道哪一行代碼運行時會造成OutOfMemoryError。
雖說沒必要,但是我們有沒有什么應(yīng)對的措施?
有,實際開發(fā)中我們碰到OutOfMemoryError的時候就會去分析我們的程序代碼,找出那個產(chǎn)生OutOfMemoryError的源頭,修正程序。
總結(jié)
- Error是錯誤。它是Java異常體系中的一種。
- Error是Throwable的子類,表示合理的應(yīng)用程序不應(yīng)該嘗試捕獲的嚴(yán)重問題。
- 當(dāng)我們遇到Error時,我們不應(yīng)該去使用try-catch捕獲它,也不應(yīng)該throws將錯誤拋出去。
- OutOfMemoryError是內(nèi)存溢出錯誤。
- 實際開發(fā)中我們碰到OutOfMemoryError的時候就會去分析我們的程序代碼,找出那個產(chǎn)生OutOfMemoryError的源頭,修正程序。
至此,Java中Error相關(guān)內(nèi)容講解先告一段落,更多內(nèi)容請持續(xù)關(guān)注。
答疑
如果大家有問題或想了解更多前沿技術(shù),請在下方留言或評論,我會為大家解答。
上一章
“全棧2019”Java異常第十六章:Throwable詳解
下一章
“全棧2019”Java異常第十八章:Exception詳解
學(xué)習(xí)小組
加入同步學(xué)習(xí)小組,共同交流與進(jìn)步。
- 方式一:關(guān)注頭條號Gorhaf,私信“Java學(xué)習(xí)小組”。
- 方式二:關(guān)注公眾號Gorhaf,回復(fù)“Java學(xué)習(xí)小組”。
全棧工程師學(xué)習(xí)計劃
關(guān)注我們,加入“全棧工程師學(xué)習(xí)計劃”。
版權(quán)聲明
原創(chuàng)不易,未經(jīng)允許不得轉(zhuǎn)載!
總結(jié)
以上是生活随笔為你收集整理的mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用了30天整理的一些GO语言学习资料,2
- 下一篇: Java中数组在内存中的存放原理?