mfc try catch 捕獲并顯示_“全棧2019”Java異常第十七章:Error該不該被捕獲?

難度

初級

學習時間

30分鐘

適合人群

零基礎

開發語言

Java

開發環境

  • JDK v11
  • IntelliJ IDEA v2018.3

友情提示

  • 本教學屬于系列教學,內容具有連貫性,本章使用到的內容之前教學中都有詳細講解。
  • 本章內容針對零基礎或基礎較差的同學比較友好,可能對于有基礎的同學來說很簡單,希望大家可以根據自己的實際情況選擇繼續看完或等待看下一篇文章。謝謝大家的諒解!

1.異常體系

在Java異常這個大家族中,Throwable是這個異常家族中的老大,它下面有兩個靠譜老弟,一個叫“Error”,一個叫“Exception”。Error老弟負責錯誤部門,Exception老弟負責異常部門,它們各司其職。我給它們做了一個結構圖:

6b852738eb99ee9c0fbde177fe96f7ad.png

Throwable在上一章《“全棧2019”Java異常第十六章:Throwable詳解》中已經介紹過了,而Exception我們已經不陌生了,前面文章都和Exception有關,Error我們比較陌生一點,這一章章我們就著重講解它。

2.已檢查的異常

在上一章中,我們知道出于編譯時檢查異常的目的,Throwable和Throwable的任何子類(除Error和RuntimeException的子類)都被視為已檢查的異常

6f8bf549c9df14f349ead2802efb322c.png

Error不是已檢查的異常,那Error是什么呢?

Error是錯誤。

在Java異常體系中有三種異常:

第一種異常是已檢查的異常。

第二種異常是錯誤。

第三種異常是運行時異常。

已檢查的異常在上一章已經聊過了,現在我們來聊聊錯誤。運行時異常放在Exception的下一章講解。

3.錯誤

57a7ade43671d43c9d23e4c77a128c6a.png

Error是Throwable的子類,表示合理的應用程序不應該嘗試捕獲的嚴重問題。當錯誤發生時,這些錯誤應該是無法預測或恢復的(try-catch或throws)。

當我們遇到Error時,我們不應該去使用try-catch捕獲它,也不應該throws將錯誤拋出去。

那該如何是好?

我們應該手動排查錯誤出現的原因及位置,然后把它解決在程序運行之前。

這里有一點非常重要,“當我們遇到Error時,我們不應該去使用try-catch捕獲它,也不應該throws將錯誤拋出去。”說的都是不應該,不是說不能。我們還是可以使用try-catch或throws,只是不應該這樣去做。

通俗來講就是,異常就像電腦打開某個軟件,然后軟件因為某個操作而崩潰了,這時你可以再重新打開一次軟件,這就相當于捕獲異常的操作修復好這個問題了;而錯誤就不一樣,錯誤就像你電腦冒煙了,這時你肯定是修不好了,也就相當于你無法捕獲這個錯誤去修復它。當然了,有小伙伴說電腦冒煙我能不能修復的試試?當然可以,這就和我們程序中遇到Error時,可以使用try-catch或者thorws,但是不建議你這么做。

我們來結合例子看看。

演示:

請拋出一個錯誤。

請觀察程序代碼及結果。

代碼:

Main類:

8a734e27067a3722cd16f4f1699d8a84.png

結果:

2506f7ee58b6227ffa1400e9ad4cd3b9.png

從運行結果來看,Error不是不能被try-catch的,而且不光可以try-catch程序還被修復好了,從運行結果我們就可以看出來:

47d29d538235a92fcadbd86aa12d383b.png

那么我們程序本身做了什么呢?

首先,我們拋出一個Error對象,用來模擬制造一個錯誤:

710fbb97bf9db350bf39ec9622bc3aee.png

緊接著,我們對其進行try-catch處理:

251a210350cb331ded996e7680756f9f.png

在catch中我們打印Error的堆棧跟蹤信息:

fe87f09f2244a1155350da61b9dc6204.png

在try-catch的下面我們輸出了一段話,這行代碼的作用只有一個,那就是驗證我們的錯誤是被成功修復的:

bad260248793e8df8efb09f5d2a51326.png

程序執行結果也符合預期:

dc0daffe4edecab6157aff97fcd5f5eb.png

可能小伙伴們說,這例子也太技術含量了吧,是不是有點太敷衍我們了?

這個例子僅僅只是演示Error可以被try-catch,下面我們來一個實際開發中的案例,而且這個錯誤是日常開發中偶爾會碰到的。

4.內存溢出OutOfMemoryError

OutOfMemoryError對于大多數零基礎的同學來說,可能比較陌生,但是對于稍微有些開發經驗的同學來說,也算是打過幾次照面的。

OutOfMemoryError是什么?

OutOfMemoryError是內存溢出錯誤。

OutOfMemoryError什么時候會發生?

OutOfMemoryError在JVM(Java虛擬機)內存不足的情況下會發生。

大家還記得我們在講解《“全棧2019”Java異常第十三章:訪問異常堆棧跟蹤信息》一章中講到的JVM內存圖嗎?里面我們講到JVM會去申請一塊內存空間,這塊內存空間專門是用來存放Java應用數據的(比如基本數據類型、數組、對象...等等)。當這塊內存空間不足的時候,就會發生OutOfMemoryError異常。

來個例子演示一下。

演示:

請制造一個OutOfMemoryError異常。

請觀察程序代碼及結果。

代碼:

Main類:

da991aff95c43431421bb8ca43d4be1c.png

結果:

2daf3c48c84a3c2ed125ad41e1fab1e1.png

從運行結果來看,我們程序的確是發生了OutOfMemoryError異常。接下來,我們看看它是怎么發生的。

程序代碼真的是好簡單,就一行:

be03a93198eadcffdcf3f263bc285a0c.png

我們創建了一個int類型的數組,只不過就是數組長度有點大,1024 * 1024 * 1024個長度。

為什么這一行代碼會產生OutOfMemoryError異常,讓JVM內存溢出?

因為我們在創建數組的時候,實際上就是在申請一塊內存空間用,這個內存空間就是數組的地盤,而且數組在申請內存空間的時候,還會按照數據類型的大小來預支實際內存大小,我們知道一個int占4個字節,我們申請了1024 * 1024 * 1024個int這么多的4個字節,可想而知內存申請有多大,所以創建一個長度超出JVM內存大小的數組時,就會產生OutOfMemoryError異常。

有的小伙伴的JVM內存可能有足夠大,所以當他運行和我一摸一摸的程序時,程序并沒有崩潰,那么請這樣的小伙伴再在數組長度的后面乘以1024。

為什么是1024?

因為1024在程序計算中容易換算,比如1KB=1024B(B:字節)。

像OutOfMemoryError我們就必要去捕獲它了,真發生了OutOfMemoryError程序就只能是崩潰之后重新運行。

為什么沒必要?

我們不知道它會什么時候出現,實際開發不像我們上面這樣去寫一個長度超出JVM內存大小的數組,內存的申請發生在每一行代碼身上,我不知道哪一行代碼運行時會造成OutOfMemoryError。

雖說沒必要,但是我們有沒有什么應對的措施?

有,實際開發中我們碰到OutOfMemoryError的時候就會去分析我們的程序代碼,找出那個產生OutOfMemoryError的源頭,修正程序。

總結

  • Error是錯誤。它是Java異常體系中的一種。
  • Error是Throwable的子類,表示合理的應用程序不應該嘗試捕獲的嚴重問題。
  • 當我們遇到Error時,我們不應該去使用try-catch捕獲它,也不應該throws將錯誤拋出去。
  • OutOfMemoryError是內存溢出錯誤。
  • 實際開發中我們碰到OutOfMemoryError的時候就會去分析我們的程序代碼,找出那個產生OutOfMemoryError的源頭,修正程序。

至此,Java中Error相關內容講解先告一段落,更多內容請持續關注。

答疑

如果大家有問題或想了解更多前沿技術,請在下方留言或評論,我會為大家解答。

上一章

“全棧2019”Java異常第十六章:Throwable詳解

下一章

“全棧2019”Java異常第十八章:Exception詳解

學習小組

加入同步學習小組,共同交流與進步。

  • 方式一:關注頭條號Gorhaf,私信“Java學習小組”。
  • 方式二:關注公眾號Gorhaf,回復“Java學習小組”。

全棧工程師學習計劃

關注我們,加入“全棧工程師學習計劃”。

2881c8854b60513f9e88e08e70caa95f.png

版權聲明

原創不易,未經允許不得轉載!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394515.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

長春高中計算機考試時間安排,長春部分高中期末考試時間出爐!

原標題:長春部分高中期末考試時間出爐!上次跟大家分享了中小學的放假時間,今天就來說說期末考試時間吧!雖然有的學校時間未定,但是按照慣例,長春市各大高中高一高二年級,本次的期末考試時間&…

用習慣了windows系統要怎樣去認識linux系統(一)

一、前言對于普通用戶來說99%都使用的是windows操作系統,即便那些會使用linux系統的技術員來說,他們PC上安裝的也是windows系統。linux系統只是用于服務器市場,可以說現在服務器市場80%使用的是linux系統。那它們兩系統之間有哪些區別呢&…

spring 配置文件模板

<?xml version"1.0" encoding"UTF-8"?><beans xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc"http://www.springframework.org/schema/mvc" xmlns:context"http://www.springframework.org/schema…

VAssistX使用小竅門

日常使用中的一些VAssistX使用小竅門&#xff0c;簡單總結下 一&#xff0c;修改VAssistX默認緩存文件路徑&#xff0c;防止默認C盤被占用空間過大 1、 打開注冊表HKCU\Software\Whole Tomato&#xff0c;新建UserDataDir&#xff0c;數值為要修改的路徑&#xff0c;如下圖&am…

react 交互_如何在React應用程序中跟蹤用戶交互

react 交互by Faouzi Oudouh通過Faouzi Oudouh 如何在React應用程序中跟蹤用戶交互 (How to track user interactions in your React app) Worry not about which Analytics provider you need to gather user interaction within your app.不必擔心需要哪個Analytics(分析)提…

shell python比較_shell中的條件判斷以及與python中的對比

shell中比如比較字符串、判斷文件是否存在及是否可讀等&#xff0c;通常用"[]"來表示條件測試。注意&#xff1a;這里的空格很重要。要確保方括號的空格。if ....; then python中的條件判斷&#xff1a; if ....: (此處是冒號&#xff0c;不同…

服務器麒麟系統能設置mtu嗎,麒麟操作系統安裝標準手冊-20210405220006.docx-原創力文檔...

精品文檔精品文檔PAGEPAGE47精品文檔PAGE.銀河麒麟V3操作系統安裝手冊V1.2編制&#xff1a;王帥校核&#xff1a;朱本亮審定&#xff1a;周俊...文檔更新日志&#xff1a;序號修訂時間修訂內容修改人審定人012017-04-12發布文檔V1.0王帥周俊022017-05-11增加啟動安裝時藍屏錯誤…

多個 gradle 文件夾 \.gradle\wrapper\dists\ 設置gradle不是每次都下載

韓夢飛沙 韓亞飛 313134555qq.com yue31313 han_meng_fei_sha 設置gradle不是每次都下載 \.gradle\wrapper\dists\ 在你導入項目的時候&#xff0c;有個選項的&#xff1a; 你要是選了Use default gradle mapper就會下載一次&#xff0c;Use local gradle distribution就會…

docker使用方式

docker使用方式安裝&#xff1a;1.安裝依賴 yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 2添加yum源 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安裝 yum install docker-ce docker-ce-cli contain…

使用AxiosJavaScript中的簡單HTTP請求

Interested in learning JavaScript? Get my ebook at jshandbook.com有興趣學習JavaScript嗎&#xff1f; 在jshandbook.com上獲取我的電子書 介紹 (Introduction) Axios is a very popular JavaScript library you can use to perform HTTP requests. It works in both Brow…

Linux中通過命令直接刪除文件中最后一行

何謂Sed(Stream EDitor):Sed原為UNIX系統上的非交談式文字編輯器(non-interactive stream editor)。當Sed讀入待編輯文件&#xff0c;會依編輯命令來進行文件的編輯工作。sed -i $d file如同其它UNIX的指令一般&#xff0c;Sed亦是由標準輸入(standard input)讀入欲編輯的文件&…

vb獲取數組長度_如何實現數組的二分查找

二分查找是一種極其高效、簡練的查找算法&#xff0c;它不僅簡單&#xff0c;易用&#xff0c;而且還非常的高效。相對于順序查找&#xff0c;二分查找在效率是呈現指數性提升&#xff0c;數據量越大&#xff0c;越能體現出二分查找法的優勢。二分查找的查找過程是&#xff1a;…

400錯誤返回了服務器信息,使用Spring MVC,接受JSON錯誤的POST請求會導致返回默認的400錯誤代碼服務器頁面...

我正在使用RESTAPI。接收到帶有錯誤JSON的POST消息(例如{sdfasdfasdf})會使Spring返回默認服務器頁面&#xff0c;以顯示400錯誤請求錯誤。我不想返回頁面&#xff0c;我想返回自定義JSON錯誤對象。當使用ExceptionHandler引發異常時&#xff0c;可以執行此操作。因此&#xff…

【Python】list和tuple 區別比較

列表 List classmates [Michael, Bob, Tracy] 元組 Tuple tuple一旦初始化就不能修改&#xff0c;比如同樣是列出同學的名字&#xff1a; >>> classmates (Michael, Bob, Tracy) 現在&#xff0c;classmates這個tuple不能變了&#xff0c;它也沒有append()&#xff…

leetcode315. 計算右側小于當前元素的個數(樹狀數組解法)

leetcode315. 計算右側小于當前元素的個數(樹狀數組解法) 題目&#xff1a;給定一個整數數組 nums&#xff0c;按要求返回一個新數組 counts。數組 counts 有該性質&#xff1a; counts[i] 的值是 nums[i] 右側小于 nums[i] 的元素的數量。 樹狀數組解法 java class Solution …

洛谷 P1101 單詞方陣

給一nn的字母方陣&#xff0c;內可能蘊含多個“yizhong”單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著 8個方向的任一方向&#xff0c;同一單詞擺放時不再改變方向&#xff0c;單詞與單詞之間可以交叉,因此有可能共用字母。輸出時&#xff0c;將不是單詞的字母用*代…

從頭學習計算機網絡_如何從頭開始構建三層神經網絡

從頭學習計算機網絡by Daphne Cornelisse達芙妮康妮莉絲(Daphne Cornelisse) 如何從頭開始構建三層神經網絡 (How to build a three-layer neural network from scratch) In this post, I will go through the steps required for building a three layer neural network. I’…

python 文件處理

f open(chenli.txt) #打開文件 first_line f.readline() print(first line:,first_line) #讀一行 print(我是分隔線.center(50,-)) data f.read() # 讀取剩下的所有內容,文件大時不要用 print(data) #打印讀取內容f.close() #關閉文件1…

第五章 MVC之Bundle詳解

一、簡述 Bundle&#xff0c;英文原意就是捆、收集、歸攏。在MVC中的Bundle技術&#xff0c;也就是一個對css和js文件的捆綁壓縮的技術。 它的用處&#xff1a; 將多個請求捆綁為一個請求&#xff0c;減少服務器請求數 壓縮javascript&#xff0c;css等資源文件&#xff0c;減小…

所給服務器端程序改寫為能夠同時響應多個客戶端連接請求的服務器程序_一文讀懂客戶端請求是如何到達服務器的...

點擊上方“藍色字體”&#xff0c;選擇 “設為星標”關鍵訊息&#xff0c;D1時間送達&#xff01;互聯網是人類歷史上最偉大的發明創造之一&#xff0c;而構成互聯網架構的核心在于TCP/IP協議。那么TCP/IP是如何工作的呢&#xff0c;我們先從數據包開始講起。1、數據包一、HTTP…