【狂神說Java】Java零基礎學習筆記-異常

来源:https://www.cnblogs.com/Ge-sun-smile/archive/2023/08/17/17638219.html
-Advertisement-
Play Games

# 【狂神說Java】Java零基礎學習筆記-異常 ## 異常01:Error和Exception ### 什麼是異常 - 實際工作中,遇到的情況不可能是非常完美的。比如:你寫的某個模塊,用戶輸入不一定符合你的要求、你的程式要打開某個文件,這個文件可能不存在或者文件格式不對,你要讀取資料庫的數據,數 ...


【狂神說Java】Java零基礎學習筆記-異常

異常01:Error和Exception

什麼是異常

  • 實際工作中,遇到的情況不可能是非常完美的。比如:你寫的某個模塊,用戶輸入不一定符合你的要求、你的程式要打開某個文件,這個文件可能不存在或者文件格式不對,你要讀取資料庫的數據,數據可能是空的等。我們的程式再跑著,記憶體或硬碟可能滿了。等等。
  • 軟體程式在運行過程中,非常可能遇到剛剛提到的這些異常問題,我們叫異常,英文是:Exception,意思是例外。這些,例外情況,或者叫異常,怎麼讓我們寫的程式做出合理的處理。而不至於程式崩潰。
  • 異常指程式運行中出現的不期而至的各種狀況,如:文件找不到、網路連接失敗、非法參數等。
  • 異常發生在程式運行期間,它影響了正常的程式執行流程。

簡單分類

  • 要理解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:
  • 異常處理框架
  • 檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程式員無法預見的。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
  • 運行時異常:運行時異常是可能被程式員避免的異常。與檢查性異常相反,運行時異常可以在編譯時被忽略。
  • 錯誤ERROR:錯誤不是異常,而是脫離程式員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。

異常體繫結構

  • Java把異常當作對象來處理,並定義一個基類java.lang.Throwable作為所有異常的超類。
  • 在Java API中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error和異常Exception

image

Error

  • Error類對象由Java虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操作無關。
  • Java虛擬機運行錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的記憶體資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止;
  • 還有發生在虛擬機試圖執行應用時,如類定義錯誤(NoClassDefFoundError)、鏈接錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應用程式的控制和處理能力之外,而且絕大多數是程式運行時不允許出現的狀況。

Exception

  • 在Exception分支中有一個重要的子類RuntimeException(運行時異常)
    • ArraylndexOutOfBoundsException(數組下標越界)
    • NullPointerException(空指針異常)
    • ArithmeticException(算術異常)
    • MissingResourceException(丟失資源)
    • ClassNotFoundException(找不到類)等異常,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。
  • 這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生;
  • Error和Exception的區別: Error通常是災難性的致命的錯誤,是程式無法控制和處理的,當出現這些異常時,Java虛擬機(JVM)一般會選擇終止線程;Exception通常情況下是可以被程式處理的,並且在程式中應該儘可能的去處理這些異常。
package com.exception;

public class Demo01 {
    public static void main(String[] args) {
//        new Demo01().a();
//        System.out.println(11/0);
//        System.out.println()
    }

//    public void a(){
//        b();
//    }
//
//    public void b(){
//        a();
//    }
}

異常02:捕獲和拋出異常

異常處理機制

  • 拋出異常
  • 捕獲異常
  • 異常處理五個關鍵字
    • try、catch、finally、throw、throws
package com.exception;

public class Test {
    public static void main(String[] args) {
        try {
            new Test().test(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }
    }

    //假設這方法中,處理不了這個異常。方法上拋出異常
    public void test(int a,int b) throws ArithmeticException{
        if (b==0){ //throw throws
            throw new ArithmeticException(); //主動的拋出異常,一般在方法中使用
        }
//        System.out.println(a/b);
    }
}

/*
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        //假設要捕獲多個異常:從小到大!

        try { //try監控區域

            if (b==0){ //throw throws
                throw new ArithmeticException(); //主動的拋出異常
            }

            System.out.println(a/b);

//            new Test().a();
        }catch (Error e){ //catch(想要捕獲的異常類型!)捕獲異常
//        }catch (Throwable e){ //catch(想要捕獲的異常類型!)捕獲異常
//            System.out.println("程式出現異常,變數b不能為0");
            System.out.println("Error");
        }catch (Exception e){
            System.out.println("Exception");
        }catch (Throwable t){
            System.out.println("Throwable");
        } finally { //finally處理善後工作
            System.out.println("finally");
        }

        //finally 可以不要finally,假設IO,資源,關閉!
    }

//    public void a(){
//        b();
//    }
//
//    public void b(){
//        a();
//    }

 */

package com.exception;

public class Test2 {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        //ctrl + alt + T
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            e.printStackTrace(); //列印錯誤的棧信息
        } finally {
        }
    }
}

異常03:自定義異常及經驗小結

自定義異常

  • 使用Java內置的異常類可以描述在編程時出現的大部分異常情況。除此之外,用戶還可以自定義異常。用戶自定義異常類,只需繼承Exception類即可。
  • 在程式中使用自定義異常類,大體可分為以下幾個步驟:
    1. 創建自定義異常類。
    2. 在方法中通過throw關鍵字拋出異常對象。
    3. 如果在當前拋出異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的聲明處通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作。
    4. 在出現異常方法的調用者中捕獲並處理異常。

實際應用中的經驗總結

  • 處理運行時異常時,採用邏輯去合理規避同時輔助try-catch處理
  • 在多重catch塊後面,可以加一個catch (Exception)來處理可能會被遺漏的異常
  • 對於不確定的代碼,也可以加上 try-catch,處理潛在的異常
  • 儘量去處理異常,切忌只是簡單地調用printStackTrace()去列印輸出
  • 具體如何處理異常,要根據不同的業務需求和異常類型去決定
  • 儘量添加finally語句塊去釋放占用的資源
package com.exception.demo02;

//自定義的異常類
public class MyException extends Exception{

    //傳遞數字>10;
    private int detail;

    public MyException(int a) {
        this.detail = a;
    }

    //toString:異常的列印信息
    @Override
    public String toString() {
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}

package com.exception.demo02;

public class Test {

    //可能會存在異常的方法
    static void test(int a) throws MyException {

        System.out.println("傳遞的參數為:"+a);

        if (a>10){
            throw new MyException(a); //拋出
        }

        System.out.println("OK");
    }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (MyException e) {
            System.out.println("MyException=>"+e);
        }
    }
}

【【狂神說Java】Java零基礎學習視頻通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=77&vd_source=fd5defd6aaa826e3b6e0c06073353e32

本文來自博客園,作者:黎明の微笑,轉載請註明原文鏈接:https://www.cnblogs.com/Ge-sun-smile/p/17638219.html


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

-Advertisement-
Play Games
更多相關文章
  • 位元組碼指令簡介 Java虛擬機的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼,Opcode)以及跟隨其後的零至多個代表此操作所需參數(稱為操作數,Operands)而構成。由於Java虛擬機採用面向操作數棧而不是寄存器的架構(這兩種架構的區別和影響將在第8章中探討),所以大多數的指 ...
  • # C++ 函數參數匹配 ## 1 單個參數匹配 ```C++ void f(); //f1 void f(int); //f2 void f(int, int); //f3 void f(double, double=3.14);//f4 int main() { f(5.6); //調用f4 r ...
  • > 本篇文章結合筆者的經歷,介紹一種通過**重寫QTreeView繪製事件**,使用**QPainter**來實現好看的列表的方式。 ## 導語 Hi🐇,各位讀者朋友,大家好。相信大家在日常的工作中,經常會接觸到**QTreeView**這個控制項吧! **QTreeView**,顧名思義,就是一種 ...
  • 預設你已經看了我的Mybatis-Plus+Mysql的教程,現在有了一個簡單的項目如下(之前的教程: https://www.cnblogs.com/leafstar/p/17638741.html) 1.下載nacao,我這裡下的是2.1.0版本 提供一下我用的版本( 鏈接:https://pa ...
  • 本文通過簡單的示例代碼和說明,讓讀者能夠瞭解Mybatis-Plus+Mysql的簡單使用 必須說明的是,本文有部分內容是為了後續的微服務寫的,所以如果只想用Mybatis-Plus的話,直接使用bank1項目即可 1.新建父項目,選用spring initializr即可,可以刪除其他文件,僅僅留 ...
  • ![](https://cdn.nlark.com/yuque/0/2023/jpeg/28753938/1691067189459-f51a48da-0da6-4e6e-aeee-75b39662cd20.jpeg) ## 一、Lambda表達式 > Lambda 是一個匿名函數,我們可以把 La ...
  • 關於票據系統設計在之前的博客中也聊過,今天做一個補充 1、架構 票據系統主要就是和票交所進行交互,圍繞這一核心,我們把系統劃分為三大部分,分別是:票據網關服務、票據業務服務、票據庫存服務。 網關服務:對接票交所,負責和票交所的交互,主要是收發報文。 業務服務:負責票據業務的處理,比如出票、背書、貼現 ...
  • # 【狂神說Java】Java零基礎學習筆記-JavaSE總結 ## JavaSE總結: ![image](https://img2023.cnblogs.com/blog/3231511/202308/3231511-20230817171925456-1307925972.jpg) ## 🎉� ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...