【JavaSE】異常

異常概述

異常指的是程序在執行的過程中,出現的非正常情況,如果不處理最終會導致JVM的非正常停止。

在Java中,使用不同的類來表示不同的異常(正所謂萬物皆對象,因此異常也使用類來表示)。一旦程序出現某種異常就創建該異常類型的對象,并且拋出。然后,程序如果捕捉到這個異常對象,那么就會進行處理;如果沒有捕捉到這個異常對象,那么就會導致程序非正常停止。

因此,程序員在編寫代碼的時候,就要充分考慮到各種可能發生的異常和錯誤,極力進行避免和預防。對于實在無法避免的,要編寫相應的代碼進行異常的檢測、異常的處理,從而增強代碼的健壯性。

異常的體系結構

Throwable

java.lang.Throwable?類是Java程序執行過程中發生的異常事件對應類的根父類。

Throwable 類存在兩個子類,分別是:Error、Exception。

Error

Error 類表示的異常是:Java虛擬機無法解決的嚴重問題。如,JVM系統內部錯誤、資源耗盡等情況。一般是不會編寫針對性的代碼進行處理,畢竟編寫代碼也不好處理。

StatckOverflowError(棧內存溢出)和OutOfMemoryError(堆內存溢出,簡稱OOM)是Error較為常見的場景,一般中高級程序猿才能處理這種問題。

Exception

Exception 類表示的異常是:其他因編程錯誤或偶然的外在因素導致的一般性問題,需要編寫針對性的代碼進行處理,使程序繼續運行。否則一旦發生異常,程序就會掛掉。例如:

  • 空指針異常
  • 試圖讀取不存在的文件
  • 網絡連接中斷
  • 數組角標越界

Exception 異常又分為編譯時異常(在執行javac命令時出現的異常,因此也被稱為受檢異常)和運行時異常(在執行java命令時出現的異常,因此也被稱為非受檢異常)。

?異常的處理方式

try-catch-finally

拋抓模型

對于拋抓模型來說,分為兩個過程:一拋一抓。

對于拋過程來說,在程序執行的過程中,一旦出現異常,那就會在產生異常的代碼處生成對應異常類的對象,并將此對象拋出。一旦將對象拋出,那么就不會再繼續執行代碼,等待抓過程的實現。

對于抓過程來說,當拋出異常時,抓過程就開始了。程序針對拋過程產生的異常對象進行捕獲處理。一旦將異常處理,那么程序就會繼續執行,但是如果并沒有處理掉,那么程序就會終止。

基本結構

try {

? ? ? ? // 可能產異常的代碼

}

catch (異常類型1) {

? ? ? ? // 當產生異常類型1時的處置措施

}

catch (異常類型2) {

? ? ? ? // 當產生異常類型2時的處置措施

}

finally {

? ? ? ? // 無論是否發生異常,都無條件執行的代碼

}

?對于try結構來說,其中存放的就是可能產生異常的代碼。當異常出現時,就會生成對應異常類的對象并拋出,并且無論是否處理了異常,try結構中產生異常代碼之后的代碼都不會繼續執行。值得注意的是,try結構中的變量,出了try結構就不能使用。

對于catch結構來說,其中存放的是處理某種異常類的代碼。一個try結構可以對應無數個catch結構,畢竟代碼可能產生的異常不止一種類型。對于try拋出的異常對象來說,catch結構就會進行匹配,一旦匹配上,就會執行catch結構中的代碼,執行完畢之后,繼續向下執行。值得注意的是,如果聲明了多個catch結構,不同的異常類型不存在子父類的情況下,誰聲明在上,誰聲明在下都可以;如果多個類型滿足子父類的情況,則子類必須聲明在上面,父類必須聲明在下邊。

對于finally結構來說,其中存放的就是一定要執行的代碼,也就是說,無論能否處理了異常,finally結構中的代碼一定會執行(唯一例外的就是如果使用System.exit(0)來結束當前正在運行的Java虛擬機,那么就不會有任何的代碼進行執行)。所以,當有一定要執行的代碼時,就要把他放到finally結構中(例如在開發中,有一些資源,如輸出流、輸入流、數據庫連接以及Socket連接等,在使用完成之后,必須有顯式的關閉。否則,GC會認為這些代碼還要使用,就不會進行回收利用,進而導致內存泄漏。像這樣的就可以把關閉操作放在finallyt中)。

注意,try是必須存在的,catch和finally兩者可以同時存在,也可以存在一個,但是不能都不存在。

catch中處理異常的方式

1. 自己編寫輸出語句,表示異常的出現。

2.?printStackTrace(),打印異常的詳細信息。(推薦)

3. getMessage(),獲取發生異常的原因

開發心得

1. 對于運行時異常,通常不進行顯式的處理。一旦在程序運行過程中,出現了運行時異常,那么就根據異常的提示信息修改代碼即可。

2. 對于編譯時異常,一定要進行處理,否則編譯不通過。

throws

基本結構

public void test() throws 異常類型1, 異常類型2 ... {

? ? ? ? // 存在編譯時異常

}

?對于throws這種處理異常的方式來說,其實就是在方法聲明的地方拋出了異常,當A方法調用此方法時,A方法繼續拋出異常,B方法調用A方法時,繼續拋出異常。如果異常真正發生了,那么程序照樣會終止。因此這種方式存在的一個問題就是:是否真正處理了異常?

是否真正處理了異常?

1. 從編譯是否能通過的角度看,也看成是給出了異常萬一出現的解決方法。而所謂的解決方案就是繼續向上拋出。

2. 如果說,throws僅是將可能出現的異常拋給了此方法的調用者。調用者仍然需要考慮如何解決處理相關異常。那么從這個角度來說,就不算解決了異常。

開發中兩種方式的選擇

1. 資源一定要被執行:try-catch-finally。

2.?如果父類被重寫的方法沒有 throws 異常類型,則子類重寫的方法中如果出現異常,只能考慮使用 try-catch-finally 進行處理,不能 throws。

3.?開發中,方法a中依此調用了b、c、d等方法,方法b、c、d之間是遞進關系。此時,如果方法b、c、d中有異常,我們通常使用throws,而方法a中通常選擇使用try-catch。

手動拋出異常

在實際開發中,如果出現不滿足具體場景的代碼問題,我們就有必要手動拋出一個指定類型的對象。通俗的說,就是在實際問題的解決中,我們不想出現某些數據,那此時就可以手動拋出。

結構:throw + 異常類的對象。

所謂的手動拋出,就是拋抓模型中的拋過程。只不過手動拋出,而非程序自動拋出。

自定義異常

如何自定義異常類?

1. 繼承于現有的異常體系。

2. 通常提供幾個重載的構造器。

3. 提供一個全局變量,聲明為:static final long serialVersionUID

如何使用自定義異常類?

1. 在具體的代碼中,滿足指定條件的情況下,需要手動的使用throw + 自定義異常類對象的方式,將異常類對象拋出。

2. 如果自定義異常類是非運行時異常,則必須考慮如何處理此異常類的對象(正是異常處理的兩種方式)。

為什么需要自定義異常類?

更希望通過異常類的名稱來判斷具體出現的問題。

舉例

/*** 自定義異常*/public class CustomException extends Exception{public CustomException() {super();}public CustomException(String message) {super(message);}public CustomException(Throwable cause) {super(cause);}}

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

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

相關文章

【HTML】HTML基礎5(特殊字符)

目錄 特殊字符的作用 常用的特殊字符 使用效果 特殊字符的作用 例如 當我在兩個文字間打出空格時 <p>“銀河護衛隊”系列 在漫威電影宇宙中一直是異數般的存在&#xff0c;不僅因為影片主角是一群反英雄&#xff0c;<strong>與超級英雄相比顯得格格不入<…

讀書筆記-三國演義-三英戰呂布

三英戰呂布是《三國演義》中的一段著名戰役&#xff0c;張飛、關羽和劉備三兄弟聯手擊敗了當時的霸主呂布&#xff0c;展現了他們的武藝和忠義。 介紹 "三英戰呂布"是《三國演義》中的一個著名戰役&#xff0c;發生在三國時期&#xff0c;講述了三位蜀漢名將——劉…

LeetCode 刷題 [C++] 第347題.前 K 個高頻元素

題目描述 給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。 題目分析 據題意可知&#xff0c;我們需要先遍歷整個數組&#xff0c;并統計每個數字出現的次數&#xff0c;保存在哈希表中&#xff1b;對元素…

synchrosized 的可重入特性、死鎖、哲學家就餐問題以及解決死鎖的方法等干貨

文章目錄 &#x1f490;synchrosized的可重入特性關于死鎖&#xff1a;哲學家就餐問題&#x1f4a1;如何避免/解決死鎖 &#x1f490;synchrosized的可重入特性 可重入特性&#xff1a;當一個線程針對一個對象同時加鎖多次&#xff0c;不會構成死鎖&#xff0c;這樣的特性稱為…

前端學習第一天-html基礎

達標要求 網頁的形成過程 常用的瀏覽器及常見的瀏覽器內核 web 標準三層組成 什么是HTML 熟練掌握HTML文檔結構 熟練掌握HTML常用標簽 1. 初識web前端 Web前端是創建Web頁面或App等前端界面呈現給用戶的過程。 Web前端開發是從網頁制作演變而來&#xff0c;早期網站主…

sklearn.preprocessing.RobustScaler(解釋和原理,分位數,四分位差)

提示&#xff1a;sklearn.preprocessing.RobustScaler&#xff08;解釋和原理&#xff0c;分位數&#xff0c;四分位差&#xff09; 文章目錄 [TOC](文章目錄) 一、RobustScaler 是什么&#xff1f;二、代碼1.代碼2.輸出結果 總結 提示&#xff1a;以下是本篇文章正文內容&…

ELK學習

ELK 一、ELK介紹 &#x1f604; “ELK”是三個開源項目的首字母縮寫&#xff0c;這三個項目分別是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一個搜索和分析引擎。Logstash 是服務器端數據處理管道&#xff0c;能夠同時從多個來源采集數據&#xff0…

網絡編程(IP、端口、協議、UDP、TCP)【詳解】

目錄 1.什么是網絡編程&#xff1f; 2.基本的通信架構 3.網絡通信三要素 4.UDP通信-快速入門 5.UDP通信-多發多收 6.TCP通信-快速入門 7.TCP通信-多發多收 8.TCP通信-同時接收多個客戶端 9.TCP通信-綜合案例 1.什么是網絡編程&#xff1f; 網絡編程是可以讓設…

Redis的事務

在 Redis 中&#xff0c;事務&#xff08;Transaction&#xff09;是一組命令的集合&#xff0c;可以作為一個單獨的操作來執行&#xff0c;保證這組命令要么全部執行成功&#xff0c;要么全部執行失敗&#xff0c;具有原子性。在 Redis 中&#xff0c;事務是通過 MULTI、EXEC、…

repo介紹和安裝

介紹 https://blog.devwiki.net/2023/11/27/Windows-repo.html 安裝&#xff1a; https://blog.csdn.net/ysy950803/article/details/104188793

網絡安全-appcms-master

一、環境 gethub上面自己找appcms-master 二、開始闖關 原理&#xff1a;在評論的時候提交可以提交到管理員列表去&#xff0c;管理員一看cookie和地址就被盜走了 點進去軟件后會發現提交按鈕 隨便提交一下看看 放到div標簽里面是不是有可能可以做&#xff0c;看看后臺吧 那…

初學者如何學習python

Python 作為當今最受歡迎的編程語言之一&#xff0c;已經被包括谷歌、優步、Instagram 等知名公司廣泛采用于他們的應用程序開發。由于其易學易用的特性&#xff0c;Python 成為了編程初學者的首選語言。特別是在機器學習和數據科學領域&#xff0c;Python 的應用更是讓它成為了…

VUE CLI3項目搭建 ESLint配置

VUE項目框架配置 一、工具準備 Node.js安裝 安裝方法&#xff1a;點擊查看WebStorm安裝 下載地址&#xff1a;點擊查看 二、環境準備 鏡像準備 1.查看代理&#xff1a;npm get registry 2.設置淘寶鏡像 2.1臨時使用. npm --registry https://registry.npm.taobao.org ins…

【電機仿真】空間矢量脈寬調制(SVPWM)算法與實現

前言 文章【電機仿真】永磁同步電機模型中所提及了PMSM數學模型&#xff0c;模型算法是電機控制的理論基礎&#xff0c;但在實際控制中&#xff0c;需要將這兩部分具象化。實際電機所需要的總是三相電流或者電壓&#xff0c;控制對象為逆變器中的開關器件&#xff0c;我們需要將…

springboot基于web的音樂網站論文

音樂網站 摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了音樂網站的開發全過程。通過分析音樂網站管理的不足&#xff0c;創建了一個計算機管理音樂網站的方案。文章介紹了音樂網站的系統分析部分&#xff0c…

114.龍芯2k1000-pmon(13)- 串口如何用

本文是講原理圖的部分&#xff0c;跟pmon的關系不大&#xff01;&#xff01; 參考手冊&#xff1a;《龍芯2K1000處理器用戶手冊.pdf》 剛剛看數據手冊&#xff0c;讓我是有點驚訝&#xff0c;但是也讓我迷惑。&#xff08;一個串口復用為4個是啥意思&#xff1f;&#xff09;…

Java項目:32 基于springboot的課程作業管理系統(含源碼數據庫+文檔免費送)

作者主頁&#xff1a;源碼空間codegym 簡介&#xff1a;Java領域優質創作者、Java項目、學習資料、技術互助 文中獲取源碼 項目介紹 管理員&#xff1a;首頁、個人中心、公告信息管理、班級管理、學生管理、教師管理、課程類型管理、課程信息管理、學生選課管理、作業布置管理…

CK98-數學家鍵盤配置

官方驅動和說明書下載地址 https://www.coolkiller.cn/download/lists_6.html 介紹&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98數學家驅動版本&#xff08;謹慎更新&#xff09; 如果升級驅動出現問題&#xff0c;重啟驅動軟件后會默認讓你恢復的。 …

[藍橋杯 2020 省 AB3] 日期識別

每日一道算法題之日期識別 一、題目描述二、思路三、C代碼 一、題目描述 題目來源&#xff1a;洛谷 【藍橋杯 2020 第三輪省賽 AB 組 F 題】小藍要處理非常多的數據, 其中有一些數據是日期。 在小藍處理的日期中有兩種常用的形式&#xff1a;英文形式和數字形式。英文形式采用…

利用小蜜蜂AI智能問答ChatGPT+AI高清繪圖生成圖文故事案例

利用小蜜蜂AI智能問答ChatGPTAI高清繪圖生成圖文故事案例 這段時間利用小蜜蜂AI網站做了一些編程、繪圖以及數據分析方面的案例。再過幾個月&#xff0c;我的大孫子就要出生了。我要用小蜜蜂AI智能問答和AI高清繪圖為大孫子生成一個1-9的數字圖文故事。 小蜜蜂AI網站可以掃如…