Java學習-第一部分-第二階段-第三節:異常

来源:https://www.cnblogs.com/wenjie2000/archive/2022/08/11/16574124.html
-Advertisement-
Play Games

異常 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 運行下麵的代碼,看看有什麼問題->引出異常和異常處理機制 public static void main(String[] args) { int num1 =10; int n ...


異常

筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

運行下麵的代碼,看看有什麼問題->引出異常和異常處理機制

public static void main(String[] args) {
    int num1 =10;
    int num2 = 0;
    int res = num1 / num2;//會報錯,除數不能為0
    System.out.println("程式繼續運行....");
}

處理思路:

public class Test {
    public static void main(String[] args) {
        int num1 =10;
        int num2 = 0;
        //解讀
        //1. num1 / num2 =>10/ 0
        //2.當執行到num1 / num2因為 num2= 0,程式就會出現(拋出)異常ArithmeticException
        //3.當拋出異常後,程式就退出,崩潰了,下麵的代碼就不在執行
        //4.大家想想這樣的程式好嗎?不好,不應該出現了一個不算致命的問題,就導致整個系統崩潰
        //5.java設計者,提供了一個叫異常處理機制來解決該問題
//        int res = num1 / num2;
        //如果程式員,認為一段代碼可能出現異常/問題,可以使用try-catch異常處理機制來解決
        // 從而保證程式的健壯性
        // 將該代碼塊->選中->快捷鍵ctrl + alt + t ->選中 try-catch
        // 6.如果進行異常處理,那麼即使出現了異常,程式可以繼續執行
        try {
            int res = num1 / num2;
        } catch (Exception e) {
//            e.printStackTrace();
            System.out.println("異常原因是:"+e.getMessage());
        }
        System.out.println("程式繼續運行....");
    }
}

異常的概念

基本概念

Java語言中,將程式執行中發生的不正常情況稱為“異常”。(開發過程中的語法錯誤和邏輯錯誤不是異常)

執行過程中所發生的異常事件可分為兩大類

  1. Error(錯誤):Java虛擬機無法解決的嚴重問題。如:JVM系統內部錯誤、資源耗盡等嚴重情況。比如:StackOverflowError[棧溢出]和OOM(out of memory). Error是嚴重錯誤,程式會崩潰。
  2. Exception:其它因編程錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的代碼進行處理。例如空指針訪問,試圖讀取不存在的文件,網路連接中斷等等,Exception 分為兩大類:運行時異常[程式運行時,發生的異常]和編譯時異常[編譯時,編譯器檢查出的異常]。

★異常體系圖

image

image

異常體系圖的小結

  1. 異常分為兩大類,運行時異常和編譯時異常。
  2. 運行時異常,編譯器檢查不出來。一般是指編程時的邏輯錯誤,是程式員應該避免其出現的異常。java.lang.RuntimeException類及它的子類都是運行時異常
  3. 對於運行時異常,可以不作處理,因為這類異常很普遍,若全處理可能會對程式的可讀性和運行效率產生影響
  4. 編譯時異常,是編譯器要求必須處置的異常。

常見的異常

常見的運行時異常

異常類 說明
NullPointerException 空指針異常
ArithmeticException 數學運算異常
ArraylndexOutOfBoundsException 數組下標越界異常
ClassCastException 類型轉換異常
NumberFormatException 數字格式不正確異常[]

常見的運行時異常舉例

  1. NullPointerException空指針異常
    當應用程式試圖在需要對象的地方使用null時,拋出該異常,看案例演示。
public static void main(String[] args) {
  String name=null;
  System.out.println(name.length());
}
  1. ArithmeticException數學運算異常
    當出現異常的遺算條件時,拋出此異常。例如,一個整數“除以零”時,拋出此類的一個實例,【前面最開始已經使用此案例,不再過多贅述】

  2. ArraylndexOutOfBoundsException數組下標越界異常用非法索引訪問數組時拋出的異常。

    如果索引為負或大於等於數組大小,則該索引為非法索引。

    public static void main(String[] args) {
        int[] arr={1,2,5};
        for (int i = 0; i <= 3; i++) {
            System.out.println(arr[i]);
        }
    }
    
  3. ClassCastException類型轉換異常

    當試圖將對象強制轉換為不是實例的子類時,拋出該異常。例如,以下代碼將生成一個ClassCastException

    public class Test {
        public static void main(String[] args) {
            A b = new B();//向上轉型
            B b2 = (B) b;//向下轉型,這裡是OK
            C c2 = (C) b;//這裡拋出ClassOastException
        }
    }
    class A {}
    class B extends A {}
    class C extends A {}
    
  4. NumberFormatException數字格式不正確異常

    當應用程式試圖將字元串轉換成一種數值類型,但該字元串不能轉換為適當格式時,拋出該異常=>使用異常我們可以確保輸入是滿足條件數字.

    public static void main(String[] args) {
        String name = "韓順平教育";
        //將String 轉成int
        int num = Integer.parseInt(name);//拋出NumberFormatException
        System.out.println(num);
    }
    

編譯異常

介紹
編譯異常是指在編譯期間,就必須處理的異常,否則代碼不能通過編譯。

常見的編譯異常

SQLException //操作資料庫時,查詢表可能發生異常

IOException//操作文件時,發生的異常

FileNotFoundException //當操作一個不存在的文件時,發生異常

ClassNotFoundException //載入類,而該類不存在時,異常

EOFException//操作文件,到文件末尾,發生異常

IllegalArguementException//參數異常

異常處理

基本介紹

異常處理就是當異常發生時,對異常處理的方式。

異常處理的方式

  1. try-catch-finally
    程式員在代碼中捕獲發生的異常,自行處理

    try {
       // 代碼/可能有異常
    }catch(Exception e){
        //捕獲到異常
        //1.當異常發生時
        //2系統將異常封裝成Exception對象e,傳遞給catch
        //3得到異常對象後,程式員,自己處理
        //4.註意,如果沒有發生異常catch代碼塊不執行
    }finally {
        //1.不管try代碼塊是否有異常發生,始終要執行finally
        //2.所以,通常將釋放資源的代碼,放在finally
    }
    
  2. throws
    將發生的異常拋出,交給調用者(方法)來處理,最頂級的處理者就是JVM

    1. try-catch-finally和throws二選一
    2. 如果程式員沒做相應處理,沒有顯示是處理異常,預設throws

    image

try-catch異常處理

try-catch方式處理異常說明

  1. Java提供try和catch塊來處理異常。try塊用於包含可能出錯的代碼。catch塊用於處理try塊中發生的異常。可以根據需要在程式中有多個try..catch塊。

  2. 基本語法

    try {
    //可疑代碼
    //將異常生成對應的異常對象,傳遞給catch塊
    }catch(異常){
    //對異常的處理
    }
    //沒有finally,語法是可以通過的
    

try-catch方式處理異常-註意事項

  1. 如果異常發生了,則異常發生後面的代碼不會執行,直接進入到catch塊.

  2. 如果異常沒有發生,則順序執行try的代碼塊,不會進入到catch.

  3. 如果希望不管是否發生異常,都執行某段代碼(比如關閉連接,釋放資源等)則使用finally {}

  4. 可以有多個catch語句,捕獲不同的異常(進行不同的業務處理),要求父類異常在後,子類異常在前,比如(Exception在後,NullPointerException在前),如果發生異常,只會匹配一個catch,【案例演示】

    public static void main(String[] args) {
        //解讀
        //1.如果try代碼塊有可能有多個異常
        //2.可以使用多個catch分別捕獲不同的異常,相應處理
        //3.要求子類異常寫在所面,父類異常寫在後面
        try {
            String person = null;
            System.out.println(person.length());//NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1 / n2; //ArithmeticException
        } catch (NullPointerException e) {
            System.out.println("空指針異常=" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算術異常=" + e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
        }
    }
    
  5. 可以進行try-finally 配合使用,這種用法相當於沒有捕獲異常,因此程式會直接崩掉。應用場景,就是執行一段代碼,不管是否發生異常,都必須執行某個業務邏輯

    public static void main(String[] args) {
        try {
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1 / n2);
        } finally {
            System.out.println("執行了finally..");//無論是否會報錯都會執行
        }
        System.out.println("程式繼續執行..");//因為上面報錯,finally執行後就強制停止運行,這行不執行
    }
    

try-catch-finally執行順序小結

  1. 如果沒有出現異常,則執行try塊中所有語句,不執行catch塊中語句,如果有finally,最後還需要執行finally裡面的語句
  2. 如果出現異常,則try塊中異常發生後,try塊剩下的語句不再執行。將執行catch塊中的語句,如果有finally,最後還需要執行finally裡面的語句!

throws異常處理

基本介紹

  1. 如果一個方法(中的語句執行時)可能生成某種異常,但是並不能確定如何處理這種異常,則此方法應顯示地聲明拋出異常,表明該方法將不對這些異常進行處理,而由該方法的調用者負責處理。

  2. 在方法聲明中用throws語句可以聲明拋出異常的列表,throws後面的異常類型可以是方法中產生的異常類型,也可以是它的父類。

    public void f2() throws FileNotFoundException,NullPointerException,ArithmeticException {
        //創建了一個文件流對象
        //解讀:
        //1.這裡的異常是一個FileNotFoundException 編譯異常
        // 2。使用前面講過的 try-catch-finally
        //3.使用throws,拋出異常,讓調用f2方法的調用者(方法)處理
        //4. throws後面的異常類型可以是方法中產生的異常類型,也可以是它的父類
        // 5. throws 關鍵字後也可以是異常列表,即可以拋出多個異常
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
    

註意事項和使用細節

  1. 對於編譯異常,程式中必須處理,比如try-catch 或者throws
  2. 對於運行時異常,程式中如果沒有處理,預設就是throws的方式處理[舉例]
  3. 子類重寫父類的方法時,對拋出異常的規定:子類重寫的方法,所拋出的異常類型要麼和父類拋出的異常一致,要麼為父類拋出的異常的類型的子類型[舉例]
  4. 在throws過程中,如果有方法 try-catch,就相當於處理異常,就可以不必throws

自定義異常

自定義異常的步驟

  1. 定義類:自定義異常類名(程式員自己寫)繼承Exception或RuntineException
  2. 如果繼承Exception,屬於編譯異常
  3. 如果繼承RuntimeException,屬於運行異常(一般來說,繼承RuntimeException)。

自定義異常的應用實例

當我們接收Person對象年齡時,要求範圍在18-120之間,否則拋出一個自定義異常(要求繼承RuntimeException),並給出提示信息。

public class Test {
    public static void main(String[] args) {
        int age = 180;
        //要求範圍在18 -120之間,否則拋出一個自定義異常
        if (!(age >= 18 && age <= 120)) {
            //這裡我們可以通過構造器,設置信息
            throw new AgeException("年齡需要在18~120之間");
        }
        System.out.println("你的年齡範圍正確。");
    }
}
//自定義一個異常
// 解讀
//1.一般情況下,我們自定義異常是繼承 RuntimeException
//2.即把自定義異常做成運行時異常,好處時,我們可以使用預設的處理機制
//3.即比較方便
class AgeException extends RuntimeException {
    public AgeException(String message) {//構造器
        super(message);
    }
}

throw和throws的對比

一覽表

意義 位置 後面跟的東西
throws 異常處理的一種方式 方法聲明處 異常類型
throw 手動生成異常對象的關鍵字 方法體中 異常對象

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Vue.use()的作用及原理 點擊打開視頻講解 在Vue中引入使用第三方庫通常我們都會採用import的形式引入進來 但是有的組件在引入之後又做了Vue.use()操作 有的組件引入進來又進行了Vue.prototype.$axios = axios 那麼它們之間有什麼聯繫呢? 例如:Vue.us ...
  • 在B/S系統開發中,前後端分離開發設計已成為一種標準,而VUE作為前端三大主流框架之一,越來越受到大家的青睞,Antdv是Antd在Vue中的實現。本系列文章主要通過Antdv和Asp.net WebApi開發學生信息管理系統,簡述前後端分離開發的主要相關內容,僅供學習分享使用,如有不足之處,還請指... ...
  • Teleport 是一種能夠將我們的模板移動到 DOM 中 Vue app 之外的其他位置的技術,不受父級style、v-show等屬性影響,但data、prop數據依舊能夠共用的技術;類似於 React 的 Portal。主要解決的問題 因為Teleport節點掛載在其他指定的DOM節點下,完全不 ...
  • 解決某些情況下 ECharts 餅圖多行標簽重疊問題 對於多行標簽的重疊問題,其實一直沒有一個完美的解決方案。 我能在網上查到的比較全面的解決方法就是這個:https://zhuanlan.zhihu.com/p/272710806 但我的項目中某些東西是明確的:Label的行數、字體大小、數據個數 ...
  • 在前端開發過程中,我們也有可能遇到噪點插畫風格的設計稿,應用基礎的前端開發知識,能不能實現噪點風格的樣式呢,本文主要內容主要就是通過幾個示例來實現幾種噪點效果。本文包含的知識點包括:CSS 屬性 mask 遮罩、SVG 濾鏡 feTurbulence、CSS 屬性 filter 濾鏡、CSS 屬性 ... ...
  • 本文結合自身後臺開發經驗,從高可用、高性能、易維護和低風險(安全)角度出發,嘗試總結業界常見微服務介面設計原則,幫助大家設計出優秀的微服務。 ...
  • 本文由老王將建好的書房計劃請小王來幫忙,小王卻想謀權篡位,老王通過教育他引出裝飾器設計模式,第二部分針對老王提出的建設性意見實現裝飾器模式,第三部分針對裝飾器模式在Jdk中的IO、Spring中的緩存管理器、Mybatis的運用來加強我們的理解,第四部分說明裝飾器模式和代理模式的區別及他們各自的應用... ...
  • 冪等性在我們的工作中無處不在,無論是支付場景還是下訂單等核心場景都會涉及,也是分散式系統最常遇到的問題,除此之外,也是大廠面試的重災區。 知道了冪等性的重要性,下麵我就詳細介紹冪等性以及具體的解決方案,希望對大家有所幫助@mikechen 什麼是冪等性 冪等是一個數學與電腦學概念,在數學中某一元運 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...