Java 複習筆記5 - 異常處理

来源:https://www.cnblogs.com/yangyuanhu/archive/2019/11/22/11909466.html
-Advertisement-
Play Games

異常處理 異常分類與體繫結構: Error 相關類型的異常是程式無法處理(大多都是修改代碼無法解決的)的異常,這類異常通常需要我們調整JVM的運行環境 Exception 相關類型的異常是程式可以處理的異常,其包含兩大子類型 編譯異常(CheckedException) 通常是語法錯誤,或是方法明確 ...


異常處理

異常分類與體繫結構:

image-20191121094447105

Error 相關類型的異常是程式無法處理(大多都是修改代碼無法解決的)的異常,這類異常通常需要我們調整JVM的運行環境

Exception 相關類型的異常是程式可以處理的異常,其包含兩大子類型

  • 編譯異常(CheckedException)

    通常是語法錯誤,或是方法明確指明可能拋出異常則必須捕獲處理

  • 運行時異常(RuntimeException)

    指的是檢查階段沒有發現任何問題,滿足所有語法規範,只有在運行時才能發現的異常

異常處理

關鍵字 try catch finally throws throw

基本語法:

image-20191121100239487

註意:

  • try 無法單獨使用,必須與catch 或finally 組合使用
  • finally 表示最終,即無論異常是否真的發生了,最終都會執行finally

  • 當異常類型為Exception時 表示通用異常處理(萬能異常處理),可以捕獲所有異常但是無法針對性的處理
  • 一個try可以有多個catch
  • 通常將Exception添加到最後一個catch中作為完全保證,讓程式可以繼續運行
  • 一個try中的所有catch下每個異常類型只能出現一次
  • catch中異常類型必須從小到大(先子類在父類)
  • 無論有多個catch最終只有一個會被執行(類似 if else.....)
  • 如要打斷finally的執行可以直接退出虛擬機,System.exit();

finally 對return的影響

在方法中,如果有finally,即使在 try 或catch中遇到了return 語句,方法也不會立即結束,而是必須執行完finally後才會執行結束,

案例:

class Test{
  public static void main(String[] args){
        System.out.println(func(0));
    //此處得到的結果為10000;
    //如果沒有finally 則是10;
  }
  public static int func(int arg){
    try{
      int a = 1/arg;
      return a;
    }catch(Exception e){
      return 10;
    }finally{
      return 10000;
    }
  }
}
強調:方法中無論是否出現異常,返回值都以finally中的返回值為準,這是不符合實際的,所以通常不這麼寫

拋出異常

throws

用於方法定義,在定義方法時可以使用throws來聲明,方法可能會拋出某種類型的異常

image-20191121103939422

什麼時候使用throws

當方法中可能會有異常,但是方法本身無法處理,或是不想處理....就可以使用throws來拋出

需要強調的是:如果一個異常拋出後沒最終沒有得到處理,將導致程式運行中斷,所以通常我們不能放任不管

使用

image-20191121104306085

註意:

  • 簡單的說,只要聲明瞭,則表明方法內部不會處理該異常,誰調用就由誰處理;

  • 相應的調用者則需要捕獲異常並處理,若調用方也無法處理,則可以繼續向上拋出
  • 一個方法也可以聲明拋出多種不同類型異常,響應的調用方應增加對應的catch

案例:

package com.yh.test;

public class Test {
    public static void main(String[] args){
       //一直拋向程式入口都沒有得到處理則程式被終止
        func3();
    }
    static public void func2() throws ArithmeticException{
        int a = 1/0;
    }

    static public void func3() throws ArithmeticException{
        try{
            func2();//func2拋出異常
        }catch (Exception e){
           //無法處理則繼續向上拋出
            throw e;
        }
    }
}

拋出多種類型異常:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args){
        try {
            func3();
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        } catch (InputMismatchException e) {
            e.printStackTrace();
        }
    }
    static public int func3() throws ArrayIndexOutOfBoundsException,InputMismatchException{//        try{
            int a = new Scanner(System.in).nextInt();
            return 10/a;
    }
}

throw

主動拋出異常

image-20191121110702483

使用場景:

當方法的提供者需要調用者提供一些數據,但是這些數據不合法,導致功能無法正常處理時,就應該主動拋出異常

調用方可以在捕獲到異常後進行處理

拋出還是處理?

方法內部導致的異常自己處理,調用者導致的異常則拋出(或者能處理則處理)

疑惑:為什麼throws Exception時編譯器要求必須提供解決方案?

因為Exception 既包含了運行時異常 又包含了 編譯時異常,所以要求必須處理,由此可知,當throws聲明的異常為編譯時異常時則要求必須提供處理代碼;

案例:

package com.yh.test;

public class Test {
    public static void main(String[] args){
        try {
            func(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static void func(int a) throws  Exception{
        if (a < 1){
            throw new Exception("參數不能小於1");
        }
    }
}

自定義異常

當內置異常無法滿足特點業務場景時,可以自定義異常類,只需要繼承Exception即可

案例:

class MyException extends Exception{
    public MyException() {
        super("固定的異常提示!");
    }
}

當異常提示信息固定的時候可以像上面一樣定義構造器

異常鏈

當一個方法拋出的異常被調用方法捕獲,但是調用方法又拋出了新的異常時,則形成了異常鏈,

如果我們在調用方法中直接拋出新的異常不做任何額外的操作時,原始異常信息則被丟失;

我們有兩個方法可以保留原始異常信息

1.實例化時使用原始異常作為參數

2.實例化後調用initCause傳入原始異常對象

案例:

package com.yh.test;

public class ExceptionLinkeTest {
    public static void main(String[] args) {
        try {
            func2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static public void fun1() throws ArithmeticException{
        int a = 1 / 0;
    }

    static public void func2() throws Exception{
        try{
            fun1();
        }catch (ArithmeticException e){
            //不保留原始異常信息
            //throw  new Exception("新的異常信息!");
          
            //保留異常信息方法1
            throw  new Exception("新的異常信息!",e);
          
            //保留異常信息方法2
              Exception newex = new Exception("新的異常信息!");
            newex.initCause(e);
            throw newex;          
        }
    }
}

當我們不做處理時,得到的異常信息如下:

image-20191121115914351

使用 方法1或方法2 來保留異常信息結果如下:

image-20191121120017971


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

-Advertisement-
Play Games
更多相關文章
  • 倒計時定時器 、 迴圈定時器 及定時器的清除 1 <body> 2 <div> 3 <input type="button" onclick="yi()" value="啟動倒計時定時器"> 4 <input type="button" onclick="er()" value="啟動迴圈定時器"> ...
  • 分支語句: if語句:一個分支 if-else語句:兩個分支,最終只執行一個分支 if-else if-else if...語句: 多個分支,也是只會執行一個 switch-case語句:多分支語句,最終也會一個(必須要有break) 三元表達式:和if-else語句是一樣的 什麼時候使用if-el ...
  • 當項目業務越來越複雜,打包出來的代碼會非常冗餘,文件體積會非常龐大。大體積文件會增加編譯時間,影響開發效率;如果直接上線,還會拉長請求和載入時長,影響網站體驗。作為一個追求極致體驗的攻城獅,是不能忍的。所以在多頁應用中優化打包尤為必要。那麼如何優化webpack打包呢? ...
  • 版本: 1、後端實現跨域(php) header("Access-Control-Allow-Origin: *"); // // 響應類型 // header('Access-Control-Allow-Methods:POST'); // // 響應頭設置 // header('Access-C ...
  • 本篇介紹筆者接觸的第一個後臺系統,從自身見聞出發,因此涉及的內容相對比較基礎,後臺大牛請自覺略過。 什麼是好友系統? 簡單的說,好友系統是維護用戶好友關係的系統。我們最熟悉的好友系統案例當屬QQ,實際上QQ是一款即時通訊工具,憑著好友系統沉澱了海量的好友關係鏈,從而鑄就了一個堅不可摧的商業帝國。好友 ...
  • 網站手機的模板 !想學習卻不知從何下手的小白們可以多多參考網站上的模版! ...
  • '''''' ''' 一、函數 1、函數定義 對功能或者動作的封裝 在類中定義,就是方法 在類之外定義,就是函數 2、函數寫法 1、定義或者申明函數 def 函數名(形參列表): 函數體(return) 2、調用函數 函數名(實參) 3、函數名 1、定義 是一個變數的名字(函數名也屬於變數) 2、用... ...
  • 例15 除法算式 問題描述 輸入正整數n(2≤n≤68),按從小到大輸出所有形如abcde/fghi=n的表達式。其中a~i為1~9的一個排列。 輸入格式 每行為一個正整數n (n <= 1500),輸入n=0結束。 輸出格式 輸出滿足條件的所有形如abcde/fghi=n的表達式,每個表達式占一行 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...