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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...