Java 基礎篇之異常

来源:https://www.cnblogs.com/Tianny/archive/2019/09/30/11613995.html
-Advertisement-
Play Games

異常 異常層次 Error:Java 運行時系統的內部錯誤和資源耗盡錯誤。應用程式不應該拋出這種類型的對象。如果出現了這樣的內部錯誤,除了通告給用戶,並儘力使程式安全地終止之外,再也無能為力了。 Exception RuntimeException:由程式錯誤導致的異常 其他異常:程式本身沒有問題, ...


異常

異常層次

  • Error:Java 運行時系統的內部錯誤和資源耗盡錯誤。應用程式不應該拋出這種類型的對象。如果出現了這樣的內部錯誤,除了通告給用戶,並儘力使程式安全地終止之外,再也無能為力了。
  • Exception
    • RuntimeException:由程式錯誤導致的異常
    • 其他異常:程式本身沒有問題,但由類似 IO 錯誤導致的異常

Checked 異常 & Runtime 異常

Checked 異常:不是 RuntimeException 類及其子類的異常實例

Runtime 異常:所有 RuntimeException 類及其子類的異常實例

Java 認為 Checked 異常都是可以被處理修複的異常,所以程式必須顯示處理 Checked 異常,如果程式沒有處理 Checked 異常,編譯時會出錯。Checked 異常體現了 Java 的設計理念,沒有完善錯誤處理的代碼根本不會被執行。

對 Checked 異常處理方式:

  • 當前方法明確知道如何處理該異常,應該使用 try-catch 處理該異常

  • 當前方法不知道如何處理該異常,應在定義該方法時聲明拋出該異常

對 Runtime 異常的處理方式:

  • Runtime 異常無需顯式聲明拋出,如果程式需要捕獲 Runtime 異常,也可以使用 try-catch 塊

throws 聲明拋出異常

如果當前方法不知道如何處理這種類型的異常,該異常應該由上一級調用者處理,如果上一級調用者也不知道如何處理,再拋出直至交由 JVM 處理。

throws 聲明拋出只能在方法聲明中使用,可以聲明拋出多個異常類。一旦使用 throws 語句聲明拋出該異常,程式就無需使用 try-catch 來捕獲異常了。

示例:下麵程式聲明不處理 IOException 異常,而是將該異常交由 JVM 處理

import java.io.FileInputStream;
import java.io.IOException;

public class ThrowsTest {
    public void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
    }
}

如果某段代碼中調用了一個帶 throws 聲明的方法,該方法聲明拋出了 Checked 異常,則表明該方法希望它的調用者來處理該異常。那麼調用者在調用該方法時,要麼將其放入 try 塊中並顯示捕獲該異常,要麼放在另一個帶 throws 聲明拋出的方法中。

示例代碼如下:

import java.io.FileInputStream;
import java.io.IOException;

public class ThrowsTest2 {

    public static void test() throws IOException {
        /* 因為 FileInputStream 的構造器聲明拋出 IOException 異常
           所以調用 test() 方法 的代碼要麼處於 try-catch 塊中
           要麼處於另一個帶 throws 聲明拋出的方法中
        */
        FileInputStream fis = new FileInputStream("a.txt");
    }

    public static void main(String[] args) throws Exception {
        /* 因為 test() 方法聲明拋出 IOException 異常
           所以調用該方法的代碼要麼處於 try-catch 塊中
           要麼處於另一個帶 throws 聲明拋出的方法中
        */
        test();
    }
}

主動拋出異常 throw

如果 throw 語句拋出的異常是 Checked 異常,則該 throw 語句要麼處於 try 塊里,顯式捕獲該異常,要麼放在一個帶 throws 聲明拋出的方法中;如果 throw 語句拋出的是 Runtime 異常,則無需放在 try 塊里,也無需放在帶 throws 聲明拋出的方法中,既可以顯式的用 try-catch 來捕獲並處理異常,也可以完全不理會該異常,把該異常交給該方法調用者處理。

import java.io.IOException;

public class ThrowTest3 {
    public static void throwChecked(int a) throws Exception {
        if (a > 0) {
            // 自行拋出 Exception 異常
            // 該代碼必須處於 try 塊里,或處於帶 throws 聲明的方法中
            throw new Exception("a的值大於0,不符合要求");
        }
    }

    public static void throwRuntime(int a) {
        if (a > 0) {
            // 自行拋出 RuntimeException 異常
            // 既可以捕獲該異常,也可以完全不理會該異常,把異常交給方法調用者處理
            throw new RuntimeException("a的值大於0,不符合要求");
        }
    }

    public static void main(String[] args) {
        try {
            // 調用聲明拋出 Checked 異常的方法,要麼顯式在 try-catch 中捕獲該異常,要麼在 main 方法中再次聲明拋出
            throwChecked(3);
        } catch (Exception e) {
            System.out.print(e.getMessage());
        }
        // 調用聲明拋出 Runtime 異常的方法既可以顯式捕獲該異常,也可以不理會該異常
        throwRuntime(3);
    }
}

自定義異常類

public class AuctionException extends Exception {
    // 無參構造器
    public AuctionException() {}
    // 帶一個字元串參數的構造器
    public AuctionException(String msg) {
        super(msg);
    }
}

異常鏈

將原始信息隱藏起來,僅向上提供必要的異常提示信息的處理方式,可以保證底層異常不會擴散到表現層,避免向上暴露太多的細節,符合面向對象的封裝原則。

public calSal() throws SalException {
    try {
        // 實現結算工資的業務邏輯
        ...
    } catch (SQLException sqle) {
        // 將原始異常記錄下來,留給管理員
        ...
        // 下麵異常中的 message 就是給用戶的提示
        throw new SalException("訪問資料庫異常“);
    } catch (Exception e) {
        // 將原始異常記錄下來,留給管理員
        ...
        // 下麵異常中的 message 就是給用戶的提示
        throw new SalException("系統出現未知異常“);
    }
}

歡迎關註我的公眾號


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

-Advertisement-
Play Games
更多相關文章
  • Django 一、web框架 框架,即時framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單的說,就是用別人搭建好的舞臺來表演你的才藝。 對於所有的web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket ...
  • # 今日內容: 1. Servlet 2. HTTP協議 3. Request ## Servlet: 1. 概念 2. 步驟 3. 執行原理 4. 生命周期 5. Servlet3.0 註解配置 6. Servlet的體繫結構 Servlet -- 介面 | GenericServlet -- 抽 ...
  • 在學習Elasticsearch 時候,因為各個版本的問題,搞不清,非常的頭疼,官方也給出了各個版本更新的情況,不過是英文版本,版本更新信息又特別多,最近學習,看了很多資料,沒有一個整理很清楚的,然後自己就統一整理下,首先聲明下麵的整理都是各個版本個人認為比較重要點,因為每個大版本更新內容太多,也不 ...
  • python裝飾器就是用於拓展原來函數功能的一種函數,這個函數的特殊之處在於它的返回值也是一個函數,使用python裝飾器的好處就是在不用更改原函數的代碼前提下給函數增加新的功能。 3.1 定義裝飾器,定義函數。 def xxx(): 函數體 3.2 應用裝飾器 在需要使用的函數、方法上@xxx即可 ...
  • 摘要 作為一個web開發者,每天都在使用者Http協議,卻總是一知半解。本文參看Http RFC7230規範,梳理了http報文部分。 http 報文構成 start line: 起始行,描述請求或響應的基本信息 ( header field CRLF ): 頭 CRLF [ message bod ...
  • Higher Order Functions 定義的是方法,而不是函數 函數可作為變數存在,可直接調用,也可作為值傳遞給其他函數 尾碼將普通方法變為函數: 根據上下文編譯器可以自動將方法轉換為函數,也可省略 尾碼 高階函數,接收函數的函數 參數類型推導 匿名函數傳遞給其他函數或方法時,如果一直到參數 ...
  • 場景 當後臺項目由部署在一臺改為部署在多台以後,解決session共用問題最常用的辦法就是把session存儲在redis等緩存中。關於session和cookie概念這裡就不再贅述了,在springboot security環境下,把session存儲到redis中共用是非常非常簡單的,除了多了一 ...
  • 上完Java課,雖然也寫了不少的Java代碼,但是一直有不少的疑惑,而static關鍵字一直困惑著我很久,今天無意探究竟,上知乎再仔細查了一下,發現了這個話題的優秀答案https://www.zhihu.com/question/36615154 這篇文章徹底把我之前對static的理解概念土崩瓦解 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...