初識java——javaSE(8)異常

文章目錄

  • 一 異常的概念與體系結構
    • 1.1 什么是異常?
    • 1.2 異常的體系結構!
    • 1.3 編譯時異常與運行時異常與Error
      • 編譯時異常:
        • 異常聲明:throws關鍵字
      • 運行時異常:
      • 什么是Error?
  • 二 處理異常
    • 2.1 異常的拋出:throw(注意與throws有區別!)
    • 2.2 異常的捕獲(具體處理):
      • try—catch語句
    • 2.3 關于異常的處理方式:
    • 2.4 異常處理流程總結:
  • 三 自定義異常類


一 異常的概念與體系結構

1.1 什么是異常?

 //異常是指代碼中除了語法錯誤之外,出現的問題導致代碼出現不正常行為的狀況稱之為異常!//在java中用異常類來表示異常,因為java的思想是一切皆對象。

比如數組越界,除0,棧溢出:這三種異常:

//數組越界:int array[] = {1,2,3,4,5};System.out.println(array[10]);

結果:
顯示為:ArrayIndexOutOfBoundsException異常(此異常為數組越界異常)
后面是原因: Index 10 out of bounds for length 5
在這里插入圖片描述

//除0System.out.println(10/0);

結果:
在這里插入圖片描述
顯示為: ArithmeticException異常(此異常為算術異常)
后面顯示原因: / by zero

1.2 異常的體系結構!

異常種類繁多,為了對不同異常或者錯誤進行很好的分類管理,Java內部維護了一個異常的體系結構:

大體的體系結構:
在這里插入圖片描述

具體的:

    其中RunTimeException以及其子類對應的異常,都稱為運行時異常。

在這里插入圖片描述

1.3 編譯時異常與運行時異常與Error

編譯時異常:

所謂編譯時異常是指在編譯階段發生的異常,為此我們必須對可能出現的編譯異常進行操作,聲明以便拋出或者直接處理。而不是像對運行時異常那樣,可以既不聲明,也不處理(異常的處理下面會闡述到!)。

異常聲明:throws關鍵字
throws關鍵字處于方法聲明時參數列表之后,當方法中拋出編譯時異常,表示該方法并沒有處理異常,而是交
給方法的調用者來處理。即此關鍵字的作用在于提醒方法的調用者處理異常。

舉例: 克隆對象:

在這里插入圖片描述
我們必須進行對可能出現的異常進行聲明或者處理!

用throws關鍵字進行聲明:
后面跟上可能出現的異常類:CloneNotSupportedException

在這里插入圖片描述

運行時異常:

運行時異常是指程序在編譯階段結束后,生成了.class文件,在JVM執行時,出現的異常。
對于可能出現的運行時異常,我們可以不進行聲明或者處理。

比如:數組越界

//數組越界:int array[] = {1,2,3,4,5};System.out.println(array[10]);

在這里插入圖片描述

什么是Error?

//Error是指java虛擬機無法解決的嚴重問題,比如:JVM內部錯誤,資源耗盡 如:棧溢出

舉例:

   public static  void func1 (){func1();}public static void main(String[] args) {func1();}

在這里插入圖片描述
要注意,紅圈的部分其他的是Exception,而此處是Error.

我們是不會用throws聲明Error類及其子類的異常的,因為出現了就沒救(JVM無法解決),無意義。

二 處理異常

當異常出現時,我們可以選擇進行處理,或者什么都不做,交給JVM處理
JVM處理的結果即拋出異常,結束程序!
在Java中,異常處理主要的5個關鍵字:throw、try、catch、?nally、throws。

2.1 異常的拋出:throw(注意與throws有區別!)

異常的拋出用于當程序出現問題時,報告給調用者情況。

舉例:

public class Test {public static  void func1 (){func1();}public static void main(String[] args) {//throw關鍵字int a = 10;if(a<20){throw new ArithmeticException("胡亂調用了異常類");}System.out.println(a);}}

在這里插入圖片描述
我們設定的條件是當a<20時,拋出異常,結果成功。

結果還表明:當拋出異常后,異常后面的代碼不被執行。

2.2 異常的捕獲(具體處理):

異常的捕獲即異常的具體處理,主要有兩種方式:一種是throws聲明,這個在前面講過,不再贅述,另一種則是try—catch捕獲

try—catch語句

try—catch語句的語法格式是:

  try{//此處放置要執行的代碼,可以會出現異常}catch (要捕獲的異常類型 e){// 如果try中的代碼拋出異常了,此處catch捕獲時異常類型與try中拋出的異常類型一致時,或者是try中拋出異常的基類//   時,就會被捕獲到 ,對異常就可以正常處理,處理完成后,跳出try-catch結構,繼續執行后序代碼}[catch(要捕獲的異常類型 e){//此處放置處理異常的代碼}finally{//此處放置的代碼,必定會被執行}]//后續代碼://此處的代碼,如果沒出現異常或者出現了異常并處理了,則此處代碼會被執行//若出現了異常但沒有被處理,則此處的代碼不會被執行!注: (1) [] 中的內容可加可不加(2) try中的代碼塊不一定會報異常!
其中finally關鍵字的代碼塊用于回收系統資源,不管是程序退出,還是拋出異常都需要回收資源
比如在打開文件后,需要關閉文件,即回收系統資源。

舉例1 :有多個異常時,try-catch語句能否同時捕獲?

       //try—catch語句//    int [] array = {1,2,3,4,5};int [] array = null;try{System.out.println(10/0);System.out.println(array.length); //打印數組的長度}catch (NullPointerException e){//空指針異常System.out.println("空指針異常");}catch (ArithmeticException e){// 異常的處理方式System.out.println(e.getMessage());   // 只打印異常信息System.out.println(e);               // 打印異常類型:異常信息e.printStackTrace();                    // 打印信息最全面}finally {System.out.println("finally中執行的代碼");}System.out.println("后續代碼塊");

在這里插入圖片描述

 結果表明:我們通過try—catch語句只能捕獲一個異常因為:  try塊內拋出異常位置之后的代碼將不會被執行

舉例2
如果多個異常的處理方式是相同的,則簡寫成:
在這里插入圖片描述

   int[] array = null;try {System.out.println(10 / 0);System.out.println(array.length); //打印數組的長度} catch (NullPointerException | ArithmeticException e) {//空指針異常System.out.println(e.getMessage()); //只打印異常信息——/by zeroSystem.out.println(e);               // 打印異常類型:異常信息e.printStackTrace();                       //打印信息最全面 ——打印異常類型,打印異常信息,還打印異常所在的代碼!} finally {System.out.println("finally中執行的代碼");}System.out.println("后續代碼塊");}

在這里插入圖片描述
舉例三:

 如果異常之間具有父子關系,一定是子類異常在前catch,父類異常在后catch,否則語法錯誤:

在這里插入圖片描述

2.3 關于異常的處理方式:

在這里插入圖片描述

2.4 異常處理流程總結:

在這里插入圖片描述

  1. 先執行try塊中的代碼
  2. 如果發現異常,則在catch中判斷是否與catch的異常類型相同,如果相同則執行catch中的代碼,如果不同則將異常向上傳遞給上一層調用者。
  3. 無論異常是否被處理,finally中的代碼都會被執行(在該方法結束之前執行),但是如果異常并沒有被處理,則后續代碼不會被執行。
  4. 如果上層調用者依然無法處理異常,則繼續傳遞給上層,直到傳遞到main方法,main方法也無法處理,則交給JVM,最終異常結束程序。
  public static void func() {int[] arr = {1, 2, 3};System.out.println(arr[100]);}public static void main(String[] args) {func();System.out.println("after try catch");}

在這里插入圖片描述
結果表明:顯示了異常的調用棧,且最終after try catch語句沒有被執行!

三 自定義異常類

java中提供的異常類不能代表所有我們在日常開發中遇到的問題,所以我們需要自己定義異常類

舉例:

package demo1;public class PasswordException extends Exception{public PasswordException(String message){super(message);}}
package demo1;public class UserNameException extends Exception{public UserNameException(String message){super(message);}
}
public class Test {private String userName = "admin";private String password = "123456";public  void loginInfo(String userName, String password)throws UserNameException,PasswordException{if (! this.userName.equals(userName)) {throw new UserNameException("用戶名錯誤!");}if (! this.password.equals(password)) {throw new PasswordException("用戶名錯誤!");}System.out.println("登陸成功");}public static void main(String[] args) {try {new Test(). loginInfo("admin", "123456");} catch (UserNameException e) {e.printStackTrace();} catch (PasswordException e) {e.printStackTrace();}}

在這里插入圖片描述

注意事項
自定義異常通常會繼承自 Exception 或者 RuntimeException
繼承自 Exception 的異常默認是受查異常
繼承自 RuntimeException 的異常默認是非受查異常.

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

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

相關文章

容器多機部署eureka及相關集群服務出現 Request execution failed with message: AuthScheme is null

預期部署方案&#xff1a;兩個eureka三個相關應用 注冊時應用出現&#xff1a;Request execution failed with message: Cannot invoke “Object.getClass()” because “authScheme” is null&#xff0c;一開始認為未正確傳遞eureka配置的賬戶密碼&#xff0c;例&#xff1a;…

5.23R語言-參數假設檢驗

理論 方差分析&#xff08;ANOVA, Analysis of Variance&#xff09;是統計學中用來比較多個樣本均值之間差異的一種方法。它通過將總變異分解為不同來源的變異來檢測因子對響應變量的影響。方差分析廣泛應用于實驗設計、質量控制、醫學研究等領域。 方差分析的基本模型 方差…

重慶人文科技學院建立“軟件安全產學研基地”,推動西南地區軟件安全發展

5月29日&#xff0c;重慶人文科技學院與開源網安簽訂了《產學研校企合作協議》&#xff0c;并舉行了“重慶人文科技學院產學研基地”授牌儀式&#xff0c;此次合作不僅深化了雙方在軟件安全領域的產學研緊密聯結&#xff0c;更是對川渝乃至西南地區軟件供應鏈安全發展起到重要的…

力扣linkedlist

反轉鏈表、 public class reverseList { // 1->2->3->o 、 o<-1<-2<-3public ListNode reverseList(ListNode head){//反轉鏈表ListNode prevnull;ListNode currhead;while(curr!null){ListNode nextcurr.next;curr.nextprev;prevcurr;currnext;}retu…

AI免費插件 批量條碼大師,支持100多種條碼類型

沒想到在網上看到一款和之前 悟空條碼 類似的條碼插件&#xff0c;叫批量條碼大師&#xff0c;他做的比 悟空條碼 功能更強&#xff0c;界面更美觀&#xff0c;特分享出來給大家。 本插件采用了BWIPJS條碼庫&#xff0c;支持110種條碼、二維碼的生成; 支持批量生成&#xff0c;…

愛堡集團數智掘金—共繪上市藍圖

&#xff08;本臺記者報&#xff09;2024年5月26日愛堡集團在浙江省杭州市上城區瑞萊克斯大酒店隆重召開規模達500人的盛會。這場聚焦智慧與創新的會議&#xff0c;旨在加速愛堡集團的數智化轉型進程&#xff0c;并為其上市之路繪制藍圖&#xff0c;吸引了眾多行業領袖和媒體的…

Qt 插件機制使用及原理

目錄 1.引言 2.插件原理 3.插件實現 3.1.定義一個接口集(只有純虛函數的類) 3.2.實現接口 4.插件的加載 4.1.靜態插件 4.1.1.靜態插件實現方式 4.1.2.靜態插件加載的過程 4.1.3.示例 4.2.動態插件 4.2.1.動態插件的加載過程 5.定位插件 6.插件開發的優勢 7.總結…

GPT-4o有點坑

GPT-4o有點坑 0. 前言1. GPT-4o簡介2. GPT-4o帶來的好處2.1 可以上傳圖片和文件2.2 更豐富的功能以及插件 3. "坑"的地方3.1 使用時間短3.2 GPT-4o變懶了 4. 總結 0. 前言 原本不想對GPT-4o的內容來進行評論的&#xff0c;但是看了相關的評論一直在說&#xff1a;技…

Ai晚班車531

1.中央網信辦等三部門&#xff1a;加快推進大模型、生成式人工智能標準研制。 2.中國石油與中國移動、華為、科大訊飛簽署合作協議。 3.Opera瀏覽器與谷歌云合作&#xff0c;接入 Gemini 大模型。 4.谷歌 Gemini 加持Chromebook Plus。 5.英飛凌&#xff1a;開發 8kW和12kW…

速盾:cdn和udp的區別?

CDN&#xff08;Content Delivery Network&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是網絡領域中常用的兩個術語&#xff0c;分別代表了不同的技術和功能。下面將分別介紹它們的區別。 功能和應用場景 CDN是一種分布式架構的網絡服務&#xff0c;通過在…

改進YOLOv8系列:構建新型單頭transformer模塊,加入到骨干尾部

改進YOLOv8系列:構建新型單頭transformer模塊,加入到骨干尾部 需要修改的代碼self attention代碼創建yaml文件測試是否創建成功本文提供了改進 YOLOv8注意力系列包含不同的注意力機制以及多種加入方式,在本文中具有完整的代碼和包含多種更有效加入YOLOv8中的yaml結構,讀者…

【論文導讀】Grid Graph Reduction for Efficient Shortest Pathfinding(2023 Access)

Grid Graph Reduction for Efficient Shortest Pathfinding 作者&#xff1a;CHAN-YOUNG KIM AND SANGHOON SULL 文章提出了一種“基于模式識別的網格阻塞”&#xff08; Pattern-Based Blocking on grid graphs&#xff0c;PBGG&#xff09;的預處理方法&#xff0c;以加快最…

XML Web 服務技術解析:WSDL 與 SOAP 原理、應用案例一覽

XML Web服務是一種用于在網絡上發布、發現和使用應用程序組件的技術。它基于一系列標準和協議&#xff0c;如WSDL、SOAP、RDF和RSS。下面是一些相關的內容&#xff1a; WSDL&#xff08;Web服務描述語言&#xff09;&#xff1a;用于描述Web服務的基于XML的語言&#xff0c;定義…

安卓手機APP開發___廣播概述

安卓手機APP開發___廣播概述 目錄 概述 關于系統廣播 系統廣播所發生的更改 接收廣播 清單聲明的接收器 上下文注冊的接收器 對進程狀態的影響 發送廣播 通過權限限制廣播 帶權限的發送 帶權限的接收 安全注意事項和最佳做法 概述 Android 應用可以通過 Android …

數據分析案例-在線食品訂單數據可視化分析與建模分類

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

springmvc揭秘參數解析

參數解析 說到參數解析&#xff0c;springmvc中處理參數的是HandlerMethodArgumentResolver接口 public interface HandlerMethodArgumentResolver { // 判斷是否支持該類型參數 boolean supportsParameter(MethodParameter parameter); // 進行參數解析 Object resolv…

[羊城杯 2021]BabySmc

運行就是輸入flag 不知道怎么跳過去的 這個應該就是smc加密的函數了 運行完這個函數才能繼續往下 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // r12__int64 v5; // r13unsigned __int64 v6; // raxchar v7; // spcha…

學習Vue中圖片上傳前進行壓縮的實現方法

學習Vue中圖片上傳前進行壓縮的實現方法 一、前言1. 為什么要在客戶端進行圖片壓縮&#xff1f;2. Vue組件中實現圖片上傳前壓縮的方法3. 注意事項與優化4. 總結 一、前言 在Web開發中&#xff0c;圖片上傳是一個常見的功能需求&#xff0c;而客戶端對圖片進行壓縮可以有效減小…

企業如何進行快遞運費對賬?

在電子面單寄件取代手寫紙質面單之后&#xff0c;加上月結寄件模式的推行&#xff0c;企業快遞運費對賬&#xff0c;成了行政的一個難題...... 早期的手寫紙質面單寄件&#xff0c;企業行政或者財務相關人員&#xff0c;遵循寄前審批&#xff0c;寄后報銷的原則進行對賬。隨著電…

FinalShell無法連接Linux

Linux使用Vmware會創建一個網絡&#xff0c;讓兩個子網處于一個網關&#xff0c;這樣就能在windows中連接Linux&#xff0c;只有在這種情況下才能FinalShell才能連接Linux