Java基礎:Java異常機制

異常是程序運行過程中出現的錯誤。Java 把異常當作對象來處理,把異常信息封裝成了一個類,并定義一個基類java.lang.Throwable作為所有異常的超類。Throwable : 它是所有錯誤與異常的超類(祖宗類),有兩個子類 ErrorException

本篇主要記錄內容包括:異常介紹、拋出異常、聲明異常、捕獲異常


  • 上一篇內容:Java基礎:Java抽象接口
  • 下一篇內容:Java集合:概述
  • 更多知識學習:全網最全的 Java 技術棧內容梳理(持續更新中)

文章目錄

    • 一、異常介紹
        • 1、異常繼承體系
        • 2、運行時期異常&編譯時異常
        • 3、發生異常到時候,程序的執行特征
        • 4、異常與錯誤的區別
        • 5、異常在方法重寫中細節
    • 二、拋出異常、聲明異常
        • 1、拋出異常 throw
        • 2、聲明異常 throws
        • 3、自定義異常
        • 4、Throwable類中的常用方法
    • 三、捕獲異常
        • 1、try…catch…finally
        • 2、異常處理流程
        • 3、try…catch…finally 異常處理的組合方式


一、異常介紹

1、異常繼承體系

異常是程序運行過程中出現的錯誤。Java 把異常當作對象來處理,把異常信息封裝成了一個類,并定義一個基類java.lang.Throwable作為所有異常的超類

  • Throwable : 它是所有錯誤與異常的超類(祖宗類),有兩個子類ErrorException
  • Error : 錯誤,程序無法處理的錯誤,比如OutOfMemoryErrorThreadDeath等。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。
  • Exception : 異常,程序本身可以處理的異常,程序中應當盡可能去處理這些異常。
    • RuntimeException : 運行期異常,JAVA程序運行過程中出現的問題,可以通過java虛擬機來自行處理
    • CheckableException : 編譯時異常或者可檢查異常,我們應該捕獲或者拋出,try…catch。

2、運行時期異常&編譯時異常

  • 運行時期異常:方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常,運行時期異常一旦發生,需要程序人員修改源代碼;
  • 編譯時異常: 必須在編譯前處理,否則無法通過編譯

3、發生異常到時候,程序的執行特征

  1. 我們的代碼,從發生異常的地方,開始被一分為二
  2. 在異常發生之前的代碼,都可以正常運行,之后的代碼不會執行
  3. 當異常發生的時候,這個異常被jvm所捕獲,并將這個異常的所有相關信息,創建為一個異常對象,然后將該異常對象的信息輸出到控制臺(執行的是虛擬機默認的異常處理代碼)
  4. 終止當前程序

4、異常與錯誤的區別

  • 異常:指程序在編譯、運行期間發生了某種異常(XxxException),我們可以對異常進行具體的處理。若不處理異常,程序將會結束運行。
  • 錯誤:指程序在運行期間發生了某種錯誤(XxxErrorError錯誤通常沒有具體的處理方式,程序將會結束運行。Error錯誤的發生往往都是系統級別的問題,都是jvm所在系統發生并反饋給jvm的。我們無法針對處理,只能修正代碼。

5、異常在方法重寫中細節

  • 子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明;
  • 當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集

二、拋出異常、聲明異常

1、拋出異常 throw

在 java 中,提供了一個throw關鍵字,它用來拋出一個指定的(Throwable類型)異常對象,一般會用于程序出現某種邏輯時,程序員主動拋出某種特定類型的異常

使用格式:throw new 異常類名(參數);

具體步驟:

  • 創建一個異常對象, 封裝一些提示信息(信息可以自己編寫).
  • 通過關鍵字throw,將這個異常對象告知給調用者.
  • throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,并結束當前方法的執行

注意事項:

  • 如果拋出的異常對象屬于可檢查的異常,必須在該方法頭部,聲明拋出此異常, 即: throws 要拋出的異常類型;
  • 其次,對于拋出可檢查的異常,還必須與方法的異常列表中的異常兼容;
  • 如果父類方法聲明了異常列表:子類可以不聲明異常列表,子類方法有自己異常列表時,必須保證,子類的異常列表所包含的異常類型,與父類中所包含的異常類型兼容

2、聲明異常 throws

將問題標識出來,報告給調用者

throws是方法可能拋出異常的聲明, 如果定義功能時有問題發生需要報告給調用者。可以通過在方法上使用throws 關鍵字進行聲明。

對于聲明了會拋出可檢查異常的方法, 就意味著這個方法會產生可檢查異常,所以,一旦調用該方法就必須對該方法做異常處理

throws后面可以寫多個異常類,用逗號隔開

聲明異常格式:修飾符 返回值類型 方法名(參數) throws <異常列表> { }

3、自定義異常

如果Java沒有提供你需要的異常,則可以自定義異常類

編譯時異常繼承Exception,運行時異常繼承RuntimeException

格式:

Class 異常名 extends Exception{ //或繼承RuntimeExceptionpublic 異常名(){}public 異常名(String s){super(s);}
}

4、Throwable類中的常用方法

  • getCause():返回拋出異常的原因,即異常提示信息。如果 cause 不存在或未知,則返回 null;
  • getMessage():返回異常的消息信息,即該異常的名稱與詳細信息字符串;
  • printStackTrace():在控制臺輸出該異常的名稱與詳細信息字符串、異常出現的代碼位置

三、捕獲異常

1、try…catch…finally

Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理

捕獲異常格式:

try {//需要被檢測的語句。
}
catch(異常類 e) { //try中拋出的是什么異常,在括號中就定義什么異常類型。//異常的處理語句。
}
finally {//一定會被執行的語句。
}
//try:該代碼塊中編寫可能產生異常的代碼。
//catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
//finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。

2、異常處理流程

  1. 首先,當異常在try*代碼塊中發生的時候,虛擬機首先捕獲這個異常,創建一個異常對象(包含本次異常的所有詳細信息);
  2. 虛擬機會把這個異常,拋出給catch代碼塊(類似于方法調用,虛擬機會調用catch代碼塊中,處理異常的代碼);
  3. 執行catch代碼塊,中的處理異常的代碼;
  4. 沒有終止我們應用程序,而是從catch語句之后的代碼開始,繼續執行我們的應用程序

3、try…catch…finally 異常處理的組合方式

  • try catch finally組合: 檢測異常,并傳遞給catch 處理,并在finally中進行資源釋放;
  • try catch組合 : 對代碼進行異常檢測,并對檢測的異常傳遞給catch處理。對異常進行捕獲處理;
  • 多個try catch組合 當可能有多種類型的異常發生的時候,我把可能產生某異常類型的代碼分開,分別放在不同的try-catch代碼塊中;
  • 一個try多個catch組合: 對代碼進行異常檢測,并對檢測的異常傳遞給catch處理,對每種異常信息進行不同的捕獲處理;
  • try finally組合: 對代碼進行異常檢測,檢測到異常后因為沒有catch,所以一樣會被默認jvm拋出,異常是沒有捕獲處理的。但是功能所開啟資源需要進行關閉,所以finally只為關閉資源

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

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

相關文章

JavaWeb:Servlet的應用及接口介紹

廣義的 Servlet 泛指在服務器上運行的 Java 程序&#xff0c;但是這個 Java 程序&#xff0c;并不能獨立運行&#xff08;因為 Servlet 沒有 main 方法&#xff09;&#xff0c;需要部署在相應的 Servlet 容器中&#xff0c;比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地…

DOCKERFILE參數注解

Dockerfile由一行行命令語句組成&#xff0c;并且支持以#開頭的注釋行。 一般的&#xff0c;Dockerfile 分為四部分&#xff1a;基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。 Dockerfile的指令是忽略大小寫的&#xff0c;建議使用大寫&#xff0c;使用 # 作為…

Zookeeper:分布式過程協同技術

Zookeeper 是一個高性能的分布式一致系統&#xff0c;在分布式系統中有著廣泛的應用。基于它&#xff0c;可以實現諸如“分布式同步”、“配置管理”、“命名空間管理”等眾多功能&#xff0c;是分布式系統中常見的基礎系統。Zookeeper 主要用來解決分布式集群中應用系統的一致…

面試題2021-2-24

給某CentOs6慮擬機添加了新的數據盤&#xff0c;設備名為/de/sdd.寫命令格式化滿加的效的并掛載到指定目錄/opt fdisk -l mkfs.ext4 /de/sdd mount /de/sdd /opt 如何查看與RabbtMQ服務器之間的establish狀態連接數&#xff1f;netstat -an |grep ESTABLISHED |grep tcp |wc -l…

Zookeeper:在三種模式下的部署

zookeeper 安裝模式有三種&#xff1a;單機模式&#xff1a;單機單 server&#xff1b;集群模式&#xff1a;多機多 server&#xff0c;形成集群&#xff1b;偽集群模式&#xff1a;單機多 server&#xff0c;形成偽集群。 ~ 本篇內容包括&#xff1a;Zookeeper 官網下載、Zook…

Linux namespace概述

操作系統通過虛擬內存技術&#xff0c;使得每個用戶進程都認為自己擁有所有的物理內存&#xff0c;這是操作系統對內存的虛擬化。操作系統通過分時調度系統&#xff0c;每個進程都能被【公平地】調度執行&#xff0c;即每個進程都能獲取到CPU&#xff0c;使得每個進程都認為自己…

Zookeeper:Zookeeper的主從選舉機制

ZAB 協議&#xff0c;全稱 Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子廣播協議&#xff09;&#xff0c;是為分布式協調服務 ZooKeeper 專門設計的一種支持崩潰恢復的一致性協議。基于該協議&#xff0c;ZooKeeper 實現了一種主從模式的系統架構來保持集群中各個副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔離hostname和NIS Domain name資源&#xff0c;使得一個宿主機可擁有多個主機名或Domain Name。換句話說&#xff0c;可讓不同namespace中的進程看到不同的主機名。 例如&#xff0c;使用unshare命令(較新版本L…

Zookeeper:事件監聽和通知機制

Zookeeper 允許客戶端向服務端的某個 Znode 注冊一個 Watcher 監聽&#xff0c;當服務端的一些指定事件觸發了這個 Watcher&#xff0c;服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能&#xff0c;然后客戶端根據 Watcher 通知狀態和事件類型做出業務上的改變。 …

Linux namespace之:mount namespace

理解mount namespace 用戶通常使用mount命令來掛載普通文件系統&#xff0c;但實際上mount能掛載的東西非常多&#xff0c;甚至連現在功能完善的Linux系統&#xff0c;其內核的正常運行也都依賴于掛載功能&#xff0c;比如掛載根文件系統/。其實所有的掛載功能和掛載信息都由內…

Linux namespace之:network namespace

理解network namespace network namespace用來隔離網絡環境&#xff0c;「在network namespace中&#xff0c;網絡設備、端口、套接字、網絡協議棧、路由表、防火墻規則等都是獨立的」。 因network namespace中具有獨立的網絡協議棧&#xff0c;因此每個network namespace中都…

Kubernetes 的原理

kubernetes 已經成為容器編排領域的王者&#xff0c;它是基于容器的集群編排引擎&#xff0c;具備擴展集群、滾動升級回滾、彈性伸縮、自動治愈、服務發現等多種特性能力。 本文將帶著大家快速了解 kubernetes &#xff0c;了解我們談論 kubernetes 都是在談論什么。 kuberne…

Zookeeper:實現“分布式鎖”的 Demo

Zookeeper 能保證數據的強一致性&#xff0c;用戶任何時候都可以相信集群中每個節點的數據都是相同的。一個用戶創建一個節點作為鎖&#xff0c;另一個用戶檢測該節點&#xff0c;如果存在&#xff0c;代表別的用戶已經鎖住&#xff0c;如果不存在&#xff0c;則可以創建一個節…

JavaIO流:案例

java.io 包下需要掌握的流有 16 個&#xff0c;本篇內容包括&#xff1a;java.io包下需要掌握的流、Java IO 案例。 文章目錄一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1&#xff08;FileInputStream&#xff09;2、Demo 2&#xff08;FileInputStream&#xff09;3…

比對excel數據

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/測算單位設置/比對/吉林/tmp001.xlsx bD:/測算單位設置/比對/吉林/國網吉林電力.xlsx cD:/測算單位設置/比對…

CPU 是如何執行任務的

前言 你清楚下面這幾個問題嗎&#xff1f; 有了內存&#xff0c;為什么還需要 CPU Cache&#xff1f; CPU 是怎么讀寫數據的&#xff1f; 如何讓 CPU 能讀取數據更快一些&#xff1f; CPU 偽共享是如何發生的&#xff1f;又該如何避免&#xff1f; CPU 是如何調度任務的&a…

Ansible 的自動化運維

1、Ansible 特點 Ansible 自 2012 年發布以來&#xff0c;很快在全球流行&#xff0c;其特點如下&#xff1a; Ansible 基于 Python 開發&#xff0c;運維工程師對其二次開發相對比較容易&#xff1b; Ansible 豐富的內置模塊&#xff0c;幾乎可以滿足一切要求&#xff1b; …

Shell 信號發送與捕捉

1、Linux信號類型 信號&#xff08;Signal&#xff09;&#xff1a;信號是在軟件層次上對中斷機制的一種模擬&#xff0c;通過給一個進程發送信號&#xff0c;執行相應的處理函數。 進程可以通過三種方式來響應一個信號&#xff1a; 1&#xff09;忽略信號&#xff0c;即對信…

運維面試題總結

集群相關 簡述 ETCD 及其特點&#xff1f; etcd 是 CoreOS 團隊發起的開源項目&#xff0c;是一個管理配置信息和服務發現&#xff08;service discovery&#xff09;的項目&#xff0c;它的目標是構建一個高可用的分布式鍵值&#xff08;key-value&#xff09;數據庫&#x…

詳解設計模式:建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;也叫做生成器模式&#xff0c;是 GoF 的 23 種設計模式的一種&#xff0c;它將一個復雜對象的構建與它的表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。 當我們需要實列化一個復雜的類&#xff0c;以得到不同結…