關于Java異常機制及finally關鍵字的詳解

異常機制(Exception)

軟件程序在運行過程中,非常可能遇到異常問題。常見的異常:
1、用戶輸入錯誤
2、設備錯誤
3、硬件問題,例如打印機關掉、服務器問題
4、物理限制:磁盤滿了

Java是采用面向對象的方式來處理異常的

處理過程

拋出異常:在執行一個方法是,如果發生異常,則這個方法生成代表該異常的一個對象,停止當前執行路徑,并把異常對象提交給JRE。

捕獲異常:JRE得到該異常后,尋找相應的代碼來處理該異常。JRE在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理代碼為止。

JDK中定義了很多異常類,這些類對應了各種各樣可能出現的異常時間,所有異常對象都是派生于Throwable類的一個實例。如果內置的異常類不能夠滿足需要,還可以創建自己的異常類。Error 錯誤類,不需要程序員管,是一個錯誤,關鍵在于Exception,需要我們程序員管。
在這里插入圖片描述

Error

Error類層次描述了Java運行時系統內部錯誤和資源耗盡錯誤。這類錯誤是我們無法控制的,同時也是非常罕見的錯誤。所以在編程中,不去處理這類錯誤。Error表明系統JVM已經處于不可恢復的崩潰狀態中。

Exception

所有異常類的父類,其子類對應了各種各樣可能出現的異常事件。
一類特殊的異常,如被0除、數組下標超范圍等,其產生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會對程序可讀性和運行效率影響很大。因此由系統自動檢測并將它們交給缺省的異常處理程序(用戶可不必對其處理)
NullpointException(空指針異常,遇到的最多的異常)
Checked Exception這一類異常,我們必須捕獲進行處理

異常的處理方法1(親自動手捕獲):

Try:try語句指定了一段代碼,該段代碼就是一次捕獲并處理的范圍。在執行過程中,當任意一條語句產生異常時,就會跳過該段中后面的代碼。代碼中可能會產生并拋出一種或幾種類型的異常對象,它后面的catch語句要分別對這些異常做相應的處理
一個try語句必須帶有至少一個catch語句塊或一個finally語句塊。注意當異常處理的代碼執行結束以后,是不會回到try語句去執行尚未執行的代碼。

Catch:每個try語句塊可以伴隨一個或多個catch語句,用于處理可能產生的不同類型的異常對象。Catch捕獲異常時的捕獲順序:如果異常類之間由繼承關系,在順序安排上需注意。越是頂層的類,越放在下面。再不然就直接把多余的catch省略掉。

finally關鍵字

有些語句,不管是否發生了異常,都必須要執行,那么就可以把這樣的語句放到finally語句塊中。通常在finally中關閉程序塊已打開的資源,比如:文件流、釋放數據庫連接等。
使用格式:

try{可能出現異常的代碼}catch(異常 對象名){處理異常的代碼-> 將來開發會將異常信息保存到日志文件中}finally{不管是否有異常,都會執行的代碼}

try-catch-finally-return執行順序

在這里插入圖片描述

  1. try中帶有return
    當try中帶有return時,會先執行return前的代碼,然后暫時保存需要return的信息,再執行finally中的代碼,最后再通過return返回之前保存的信息。但如果finally通過地址改變了變量,還是會影響方法返回值的。

  2. catch中帶有return
    catch中return與try中一樣,會先執行return前的代碼,然后暫時保存需要return的信息,再執行finally中的代碼,最后再通過return返回之前保存的信息。

  3. finally中帶有return
    當finally中有return的時候,try中的return會失效,在執行完finally的return之后,就不會再執行try中的return。這種寫法,編譯是可以編譯通過的,但是編譯器會給予警告,所以不推薦在finally中寫return,這會破壞程序的完整性,而且一旦finally里出現異常,會導致catch中的異常被覆蓋。

總結:

  1. finally中的代碼總會被執行。
  2. 當try、catch中有return時,也會執行finally。return的時候,要注意返回值的類型,是否受到finally中代碼的影響。
  3. finally中有return時,會直接在finally中退出,導致try、catch中的return失效。

異常的處理方法2(聲明異常:throws子句)

當Checked Exception產生時,不一定立刻處理它,可以再把異常Throws出去。如果一個方法拋出多個已檢查異常,就必須在方法的首部列出所有的異常,之間以逗號隔開。
方法重寫中聲明異常原則:子類聲明的異常范圍不能超過父類聲明的范圍。即1、父類沒有聲明異常,子類也不能;2、不可拋出原有方法拋出異常類的父類或上層類

自定義異常

在程序中,可能會遇到任何標準異常類都沒有充分的描述清楚的問題,這種情況下可以創建自己的異常類,從Exception類或者它的子類派生一個子類即可。習慣上,定義的類應該包含2個構造器:一個是默認的構造器,另一個是帶有詳細信息的構造器。

  1. 定義一個類
  2. 如果繼承Exception 就是編譯時期異常
  3. 如果繼承RuntimeException,就是運行時期異常

使用異常機制建議

  1. 要避免使用異常處理代替錯誤處理,這樣會降低程序的清晰性,并且效率低下。
  2. 處理異常不可以代替簡單測試(只在異常情況下使用異常機制)
  3. 不要進行小粒度的異常處理——應該將整個任務包裝在一個Try語句塊中
  4. 異常往往在高層處理

打印異常信息的三個方法

這些方法均繼承于Throwable類:

  1. String toString() :輸出異常類型和設置的異常信息
  2. String getMessage(): 輸出設置的異常信息 ,只顯示產生異常的原因,但不顯示類名。
  3. void printStackTrace():打印異常信息是最全的:包括異常類型,信息,以及出現的行數等,常用來跟蹤異常事件發生時堆棧的內容。
public class Exception {public static void main(String[] args) {//1.定義一個用戶名,代表已經注冊的用戶String username = "root";//2.創建Scanner對象,錄入用戶名Scanner sc = new Scanner(System.in);System.out.println("請您輸入要登錄的用戶名:");String name = sc.next();//3.判斷用戶名是否和已經存在的用戶名一致if (name.equals(username)) {System.out.println("登錄成功了");} else {try {throw new LoginUserException("登錄失敗了,用戶名或者密碼有問題");}catch (Exception e){System.out.println(e.toString()); //輸出異常類型和設置的異常信息System.out.println(e.getMessage()); //輸出設置的異常信息 ,只顯示產生異常的原因,但不顯示類名。e.printStackTrace(); //打印異常類型,信息,以及出現的行數}}}
}

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

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

相關文章

基于Java的水果商品銷售網站

1 水果商品銷售網站概述 1.1 課題簡介 隨著電子商務在當今社會的迅猛發展,水果在線銷售已逐漸演變為一種極為便捷的購物方式,日益受到人們的青睞。本系統的設計初衷便是構建一個功能完備、用戶體驗友好的水果銷售平臺,致力于為用戶提供優質、…

Xcode簡介

Xcode 是蘋果公司為 macOS 平臺開發的一款集成開發環境(Integrated Development Environment,IDE),主要用于開發 iOS、iPadOS、macOS、watchOS 和 tvOS 的應用程序。Xcode 包含了一系列的軟件開發工具,涵蓋了從編寫代碼…

【植物大戰僵尸雜交版】獲取+存檔插件

文章目錄 一、還記得《植物大戰僵尸》嗎?二、在哪下載,怎么安裝?三、雜交版如何進行存檔功能概述 一、還記得《植物大戰僵尸》嗎? 最近,一款曾經在15年前風靡一時的經典游戲《植物大戰僵尸》似乎迎來了它的"文藝復…

漸開線花鍵測量學習筆記分享

大家好,繼續漸開線花鍵的相關內容,本期是漸開線花鍵測量相關的學習筆記分享: 花鍵檢測項目有花鍵大徑和小徑檢驗;內花鍵齒槽寬和外花鍵齒厚,以及漸開線終止圓 和起始圓直徑檢測;齒距累計誤差 、齒形誤差 、…

排序算法簡述(第八jiang)

目錄 排序 選擇排序 O(n2) 不穩定:48429 歸并排序 O(n log n) 穩定 插入排序 O(n2) 堆排序 O(n log n) 希爾排序 O(n log2 n) 圖書館排序 O(n log n) 冒泡排序 O(n2) 優化: 基數排序 O(n k) 快速排序 O(n log n)【分治】 不穩定 桶排序 O(n…

Mysql-常用函數及其用法總結

1、字符串函數 測試用例如下: 1.1 CONCAT() 將多個字符串連接成一個字符串。 SELECT CONCAT(first_name, , last_name) AS full_name FROM users; -- 期望結果:John Doe, Jane Smith, Michael Johnson 1.2 SUBSTRING() 提取子字符串 SELECT SUBSTR…

STM32-PWR和WDG看門狗

本內容基于江協科技STM32視頻學習之后整理而得。 文章目錄 1. PWR1.1 PWR簡介1.2 電源框圖1.3 上電復位和掉電復位1.4 可編程電壓監測器1.5 低功耗模式1.6 模式選擇1.7 睡眠模式1.8 停止模式1.9 待機模式1.10 庫函數 2. WDG看門狗2.1 WDG簡介2.2 IWDG框圖2.3 IWDG鍵寄存器2.4 …

13 學習總結:指針 · 其一

目錄 一、內存和地址 (一)內存 (二)內存單元 (三)地址 (四)拓展:CPU與內存的聯系 二、指針變量和地址 (一)創建變量的本質 (二…

Ansible常用模塊

華子目錄 Ansible四個命令模塊1.組成2.特點3.區別3.1command、shell模塊3.2raw模塊 4.command模塊4.1參數表4.2free_form參數 5.shell模塊5.1作用5.2例如 6.script模塊6.1示例 7.raw模塊7.1參數7.2示例 文件操作模塊1.file模塊1.1參數1.2示例 2.copy模塊2.1參數 Ansible四個命令…

用4個方法檢查家里的燈是否傷孩子的眼睛

為什么小孩子帶眼鏡的越來越多?      現在的孩子都在樓上玩手機看電視,當然它就傷眼睛了      除了這些電子產品傷眼睛,還有一處隱形的因素被忽略了      你主要看4個標準      1,你看看燈的照度,有些…

ASRock Creator系列GPU:為AI推理及多GPU系統打造,采用16針電源接口的Radeon RX 7900系列顯卡

ASRock 正在籌備推出專為人工智能推理和多GPU系統設計的AMD GPU——Creator系列顯卡。這一系列顯卡采用雙槽位、吹風式設計,并配備16針電源連接器,首發產品包括基于Navi 31架構的AMD Radeon RX 7900XTX和RX 7900 XT型號。這些原屬于WS系列的顯卡最初在20…

2024年華為OD機試真題-小朋友來自多少小區-C++-OD統一考試(C卷D卷)

2024年OD統一考試(D卷)完整題庫:華為OD機試2024年最新題庫(Python、JAVA、C++合集) 題目描述: 幼兒園組織活動,老師布置了一個任務:每個小朋友去了解與自己同一個小區的小朋友還有幾個。我們將這些數量匯總到數組garden中。 請根據這些小朋友給出的信息,計算班級小朋…

機器學習與現代醫療設備的結合:革新醫療健康的未來

🎬 鴿芷咕:個人主頁 🔥 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! 引言 隨著技術的不斷進步,機器學習(Machine Learning, ML)在現代醫療設備中的應用正在改變著…

python基礎語法 006 內置函數

1 內置函數 材料參考:內置函數 — Python 3.12.4 文檔 Python 解釋器內置了很多函數和類型,任何時候都能直接使用 內置函數有無返回值,是python自己定義,不能以偏概全說都有返回值 以下為較為常用的內置函數,歡迎補充…

【華為OD題目0008-雙十一】

華為OD題目0008-雙十一 華為OD題目0008-雙十一 華為OD題目0008-雙十一 題目描述 雙十一眾多商品進行打折銷售,小明想購買一些自己心儀的商品, 但由于受購買資金限制,所以他決定從眾多心意商品中購買3件, 而且想盡可能的花完資金&…

什么是CTO?如何成為一名優秀的CTO?

一、什么是CTO? 首席技術官(CTO)是一位負責領導和管理企業技術戰略的高級職務。CTO的主要職責包括規劃技術戰略、監督研發活動、領導技術團隊等。 二、CTO的主要職責 首席技術官,即CTO,是企業中負責技術和研發的高級管…

Redies基礎篇(一)

Redis 是一個高性能的key-value數據庫。Redies支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的&#xff…

【ETABS】【RHINO】案例:Swallow to ETABS

文章目錄 01. Swallow Overview總覽1 LOAD:Defination of LoadCase、Response Combo2 SectionArea Section and Area Load(面截面定義與指定,面荷載指定)Frame Section with rebarattr and linear load(帶鋼筋屬性框架…

下載,連接mysql數據庫驅動(最詳細)

前言 本篇博客,我講講如何連接數據庫?我使用mysql數據庫舉例。 目錄 下載對應的數據庫jar 包 百度網盤 存有8.4.0版本壓縮包:鏈接:https://pan.baidu.com/s/13uZtXRmuewHRbXaaCU0Xsw?pwduipy 提取碼:uipy 復制這…

STM32-TIM定時器

本內容基于江協科技STM32視頻內容,整理而得。 文章目錄 1. TIM1.1 TIM定時器1.2 定時器類型1.3 基本定時器1.4 通用定時器1.4 高級定時器1.5 定時中斷基本結構1.6 預分頻器時序1.7 計數器時序1.8 計數器無預裝時序1.9 計數器有預裝時序1.10 RCC時鐘樹 2. TIM庫函數…