【Java基礎】Java異常捕捉,throws/throw、finally、try、catch關鍵字的含義與運用

1. Java 異常處理:

異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的。

  • 比如說,你的代碼少了一個分號,那么運行出來結果是提示是錯 java.lang.Error;
  • 如果你用System.out.println(11/0),那么你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。

1.1 異常分析

異常發生的原因有很多,通常包含以下幾大類:

  • 用戶輸入了非法數據。
  • 要打開的文件不存在。
  • 網絡通信時連接中斷,或者JVM內存溢出。
    這些異常有的是因為用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的。

一要理解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:

檢查性異常:

  • 最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的。
  • 例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。

運行時異常:

  • 運行時異常是可能被程序員避免的異常。
  • 與檢查性異常相反,運行時異常可以在編譯時被忽略。

錯誤:

  • 錯誤不是異常,而是脫離程序員控制的問題。
  • 錯誤在代碼中通常被忽略。
  • 例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。

1.2 Exception 類的層次

  • 所有的異常類是從 java.lang.Exception 類繼承的子類。

  • Exception 類是 Throwable 類的子類。除了Exception類外,Throwable還有一個子類Error 。

Java 程序通常不捕獲錯誤。錯誤一般發生在嚴重故障時,它們在Java程序處理的范疇之外。

  • Error 用來指示運行時環境發生的錯誤。
    例如,JVM 內存溢出。一般地,程序不會從錯誤中恢復。

  • 異常類有兩個主要的子類:IOException 類和 RuntimeException 類。

在 Java 內置類中,有大部分常用檢查性和非檢查性異常。

捕獲異常:

  • 使用 try 和 catch 關鍵字可以捕獲異常。
  • try/catch 代碼塊放在異常可能發生的地方。
  • try/catch代碼塊中的代碼稱為保護代碼。

使用 try/catch 的語法如下:

try
{// 程序代碼
}catch(ExceptionName e1)
{//Catch 塊
}
  • Catch 語句包含要捕獲異常類型的聲明。
  • 當保護代碼塊中發生一個異常時,try 后面的 catch 塊就會被檢查。
  • 如果發生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個參數到方法是一樣。

下面的例子中聲明有兩個元素的一個數組,當代碼試圖訪問數組的第三個元素的時候就會拋出一個異常。

import java.io.*;
public class ExcepTest{public static void main(String args[]){try{int a[] = new int[2];System.out.println("Access element three :" + a[3]);}catch(ArrayIndexOutOfBoundsException e){System.out.println("Exception thrown  :" + e);}System.out.println("Out of the block");}
}

以上代碼編譯運行輸出結果如下:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

1.3 多重捕獲塊:

一個 try 代碼塊后面跟隨多個 catch 代碼塊的情況就叫多重捕獲。

  • 多重捕獲塊的語法如下所示:
try{ // 程序代碼 }
catch(異常類型1 異常的變量名1){ // 程序代碼 }
catch(異常類型2 異常的變量名2){ // 程序代碼 }
catch(異常類型2 異常的變量名2){ // 程序代碼 }

上面的代碼段包含了 3 個 catch塊。

可以在 try 語句后面添加任意數量的 catch 塊。

如果保護代碼中發生異常,異常被拋給第一個 catch 塊。

  • 如果拋出異常的數據類型與 ExceptionType1 匹配,它在這里就會被捕獲。
  • 如果不匹配,它會被傳遞給第二個 catch 塊。
  • 直到異常被捕獲或者通過所有的 catch 塊。

1.4 throws/throw 關鍵字:

如果一個方法沒有捕獲到一個檢查性異常,那么該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。

  • 也可以使用 throw 關鍵字拋出一個異常,無論它是新實例化的還是剛捕獲到的。

下面方法的聲明拋出一個 RemoteException 異常:

import java.io.*;
public class className
{public void deposit(double amount) throws RemoteException{// Method implementationthrow new RemoteException();}//Remainder of class definition
}

!一個方法可以聲明拋出多個異常,多個異常之間用逗號隔開。

例如,下面的方法聲明拋出 RemoteException 和 InsufficientFundsException:

import java.io.*;
public class className
{public void withdraw(double amount) throws RemoteException,InsufficientFundsException{// Method implementation}//Remainder of class definition
}

1.5 finally關鍵字:

  • finally 關鍵字用來創建在 try 代碼塊后面執行的代碼塊。
  • 無論是否發生異常,finally 代碼塊中的代碼總會被執行。=
  • 在 finally 代碼塊中,可以運行清理類型等收尾善后性質的語句。

finally 代碼塊出現在 catch 代碼塊最后,語法如下:

try{ // 程序代碼 }
catch(異常類型1 異常的變量名1){ // 程序代碼 }
catch(異常類型2 異常的變量名2){ // 程序代碼 }
finally{ // 程序代碼 }

注意下面事項:

  • catch 不能獨立于 try 存在。

  • 在 try/catch 后面添加 finally 塊并非強制性要求的。

  • try 代碼后不能既沒 catch 塊也沒 finally 塊。

  • try, catch, finally 塊之間不能添加任何代碼。

1.6 聲明自定義異常:

在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。

  • 所有異常都必須是 Throwable 的子類。

  • 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。

  • 如果你想寫一個運行時異常類,那么需要繼承 RuntimeException 類。

可以像下面這樣定義自己的異常類:

class MyException extends Exception{ }
  • 只繼承Exception 類來創建的異常類是檢查性異常類。

下面的 InsufficientFundsException 類是用戶定義的異常類,它繼承自 Exception。

一個異常類和其它任何類一樣,包含有變量和方法。

以下實例是一個銀行賬戶的模擬,通過銀行卡的號碼完成識別,可以進行存錢和取錢的操作。

import java.io.*;
//自定義異常類,繼承Exception類
public class InsufficientFundsException extends Exception
{//此處的amount用來儲存當出現異常(取出錢多于余額時)所缺乏的錢private double amount;public InsufficientFundsException(double amount){this.amount = amount;}public double getAmount(){return amount;}
}

為了展示如何使用我們自定義的異常類,
在下面的 CheckingAccount 類中包含一個 withdraw() 方法拋出一個 InsufficientFundsException 異常。

import java.io.*;
//此類模擬銀行賬戶
public class CheckingAccount
{//balance為余額,number為卡號private double balance;private int number;public CheckingAccount(int number){this.number = number;}//方法:存錢public void deposit(double amount){balance += amount;}//方法:取錢public void withdraw(double amount) throws InsufficientFundsException{if(amount <= balance){balance -= amount;}else{double needs = amount - balance;throw new InsufficientFundsException(needs);}}//方法:返回余額public double getBalance(){return balance;}//方法:返回卡號public int getNumber(){return number;}
}

下面的 BankDemo 程序示范了如何調用 CheckingAccount 類的 deposit() 和 withdraw() 方法。

public class BankDemo
{public static void main(String [] args){CheckingAccount c = new CheckingAccount(101);System.out.println("Depositing $500...");c.deposit(500.00);try{System.out.println("\nWithdrawing $100...");c.withdraw(100.00);System.out.println("\nWithdrawing $600...");c.withdraw(600.00);}catch(InsufficientFundsException e){System.out.println("Sorry, but you are short $" + e.getAmount());e.printStackTrace();}}
}

編譯上面三個文件,并運行程序 BankDemo,得到結果如下所示:

Depositing $500...
Withdrawing $100...
Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsExceptionat CheckingAccount.withdraw(CheckingAccount.java:25)at BankDemo.main(BankDemo.java:13)

1.7 通用異常:

在Java中定義了兩種類型的異常和錯誤。

  • JVM(Java虛擬機) 異常:

    • 由 JVM 拋出的異常或錯誤。
    • 例如:NullPointerException 類,ArrayIndexOutOfBoundsException 類,ClassCastException 類。
  • 程序級異常:

    • 由程序或者API程序拋出的異常。
    • 例如 IllegalArgumentException 類,IllegalStateException 類。

2. ??Java基礎專欄 - 前篇回顧

  • 認識Java,Java程序的生命周期,運行Java程序
  • Java數據類型闡述、基本數據類型的占用和范圍、二進制的講述
  • 8種基本數據類型的分析、數據類型轉換規則、轉義字符的列舉
  • 五種運算符的說明(&&、||、>=、>、<=、<)、4種控制語句(if、for、while、dowhile)、輸入和輸出說明
  • 方法的概念、方法的調用、方法重載、構造方法的創建
  • 全方面帶你了解Java里的日期與時間內容,介紹 Calendar、GregorianCalendar、Date類
  • 正則表達式的使用與常用類分享
  • Stream流、文件File相關操作,IO的含義與運用

3. 💕👉 其他好文推薦

  • 還不了解Git分布式版本控制器?本文將帶你全面了解并掌握
  • 帶你認識Maven的依賴、繼承和聚合都是什么!有什么用?
  • 2-3樹思想與紅黑樹的實現與基本原理
  • !全網最全! ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用
  • 全面深入Java GC!!帶你完全了解 GC垃圾回收機制!!
  • 全面了解Java的內存模型(JMM)!詳細清晰!
  • 在JVM中,類是如何被加載的呢?本篇文章就帶你認識類加載的一套流程!
  • 帶你了解Go語言的判斷語句、切片和映射表!!
  • (Java并發編程—JUC)帶你重新認識進程與線程!!讓你深層次了解線程運行的睡眠與打斷!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65762.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js 中堆、棧、隊列+宏任務+微任務+web workers

文章目錄 js 中堆、棧、隊列介紹js中 堆、棧、隊列的區別與應用拓展&#xff08;宏任務與微任務&#xff09;Web Workers js 中堆、棧、隊列介紹 棧&#xff08;Stack&#xff09; 概念&#xff1a; 棧是一種遵循后進先出&#xff08;LIFO - Last In First Out&#xff09;原則…

java面向對象編程特性概述

目錄 1. 類和對象 2. 封裝&#xff08;Encapsulation&#xff09; 3. 繼承&#xff08;Inheritance&#xff09; 4. 多態&#xff08;Polymorphism&#xff09; 5. 抽象&#xff08;Abstraction&#xff09; (1). 抽象類&#xff08;Abstract Class&#xff09; (2).接口…

React(二)——Admin主頁/Orders頁面/Category頁面

文章目錄 項目地址一、側邊欄1.1 具體實現 二、Header2.1 實現 三、Orders頁面3.1 分頁和搜索3.2 點擊箭頭顯示商家所有訂單3.3 頁碼按鈕以及分頁 四、Category頁面4.1 左側商品添加欄目4.2 右側商品上傳欄 五、Sellers頁面六、Payment Request 頁面&#xff08;百萬數據加載&a…

maven 下載依賴 jhash:2.1.2 和對應 jar 包

原文地址 前言 25年新的一年&#xff0c;那就先更新一篇技術文章吧&#xff0c;這個是這幾天剛遇到的一個有意思的bug&#xff0c;記錄分享一下 原因分析 在使用maven加載一個項目的時&#xff0c;發現maven的依賴一直無法解析&#xff0c;更換阿里云鏡像和中央倉庫都沒辦法…

谷歌開放語音命令數據集,助力初學者踏入音頻識別領域

在人工智能的浪潮中&#xff0c;語音識別技術正逐漸成為我們日常生活的一部分。從智能助手到語音控制設備&#xff0c;語音識別的應用場景越來越廣泛。然而&#xff0c;對于初學者來說&#xff0c;進入這一領域往往面臨諸多挑戰&#xff0c;尤其是缺乏合適的開源數據集和簡單的…

nums[:]數組切片

問題&#xff1a;給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 使用代碼如下沒有辦法通過測試示例&#xff0c;必須將最后一行代碼改成 nums[:]nums[-k:]nums[:-k]切片形式&#xff1a; 原因&#xff1a;列表的切片操作 …

python-leetcode-三數之和

15. 三數之和 - 力扣&#xff08;LeetCode&#xff09; class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort() # 排序n len(nums)res []for i in range(n):# 剪枝&#xff1a;如果當前數 > 0&#xff0c;三數之和不可能為 0if nums[i]…

字節小米等后端崗位C++面試題

C 基礎 引用和指針之間的區別&#xff1f;堆棧和堆中的內存分配有何區別&#xff1f;存在哪些類型的智能指針&#xff1f;unique_ptr 是如何實現的&#xff1f;我們如何強制在 unique_ptr 中僅存在一個對象所有者&#xff1f;shared_ptr 如何工作&#xff1f;對象之間如何同步…

極狐GitLab 正式發布安全版本17.7.1、17.6.3、17.5.5

本分分享極狐GitLab 補丁版本 17.7.1, 17.6.3, 17.5.5 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任何…

探索綠色能源系統的固態繼電器:2025年展望

隨著全球向綠色能源轉型的加速&#xff0c;對高效、可靠和環保元件的需求從未如此強烈。在這種背景下&#xff0c;國產固態繼電器(SSR)在實現太陽能逆變器、風力渦輪機和儲能系統等關鍵技術方面發揮著關鍵作用。本文探討了綠色能源系統背景下中國固態繼電器行業的前景&#xff…

Rust語言使用iced實現簡單GUI頁面

使用cargo新建一個rust項目 cargo new gui_demo cd gui_demo 編輯Cargo.toml文件 ,添加iced依賴 [package] name "gui_demo" version "0.1.0" edition "2021"[dependencies] iced "0.4.2" 編輯src/main.rs文件&#xff1a; u…

Github提交Pull Request教程 Git基礎掃盲(零基礎易懂)

1 PR是什么&#xff1f; PR&#xff0c;全稱Pull Request&#xff08;拉取請求&#xff09;&#xff0c;是一種非常重要的協作機制&#xff0c;它是 Git 和 GitHub 等代碼托管平臺中常見的功能&#xff0c;被廣泛用于參與社區貢獻&#xff0c;從而促進項目的發展。 PR的整個過…

MySQL 中刪除重復數據 SQL 寫法

要在 MySQL 中刪除重復的數據并只保留一條&#xff0c;可以使用下面的方法&#xff08;要用的時候直接復制小改下條件和表名稱即即可&#xff09; 方法一&#xff1a;使用 left join 子查詢刪除重復數據(推薦) 溫馨提示&#xff1a;本人在 500w 數據下執行此 SQL 耗費 15s-30s…

RabbitMQ 可觀測性最佳實踐

RabbitMQ 簡介 RabbitMQ 是一個開源的消息代理和隊列服務器&#xff0c;用 Erlang 語言編寫&#xff0c;支持多種客戶端。它通過使用交換機&#xff08;Exchanges&#xff09;、隊列&#xff08;Queues&#xff09;和綁定&#xff08;Bindings&#xff09;來路由消息&#xff…

美攝科技PC端視頻編輯解決方案,為企業打造專屬的高效創作平臺

在當今這個信息爆炸的時代&#xff0c;視頻已成為不可或缺的重要內容形式&#xff0c;美攝科技推出了PC端視頻編輯解決方案的私有化部署服務&#xff0c;旨在為企業提供一款量身定制的高效創作平臺。 一、全面功能&#xff0c;滿足企業多樣化需求 美攝科技的PC端視頻編輯解決…

【Oracle篇】深入了解執行計劃中的訪問路徑(含表級別、B樹索引、位圖索引、簇表四大類訪問路徑)

&#x1f4ab;《博主介紹》&#xff1a;?又是一天沒白過&#xff0c;我是奈斯&#xff0c;從事IT領域? &#x1f4ab;《擅長領域》&#xff1a;??擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(…

騰訊云AI代碼助手編程挑戰賽-廚房助手之AI大廚

騰訊云AI代碼助手編程挑戰賽-廚房助手之AI大廚 作品簡介 身處當今如火箭般迅猛發展的互聯網時代&#xff0c;智能聊天助手已然化身成為提升用戶體驗的關鍵利器&#xff0c;全方位滲透至人們的數字生活。 緊緊跟隨著這股洶涌澎湃的時代浪潮&#xff0c;我毅然投身于極具挑戰性…

vscode 無法使用npm, cmd命令行窗口可以正常執行

解決方法&#xff1a; 執行命令獲得命令的位置 get-command npm 得到如下 然后刪除或者修改 npm.ps1文件 讓其不能使用就行。然后重啟vscode即可。 pnpm 同理即可 另外加速源 國內鏡像源&#xff08;淘寶&#xff09;&#xff1a; npm config set registry https://regist…

簡易CPU設計入門:算術邏輯單元(四)

項目代碼下載 請大家首先準備好本項目所用的源代碼。如果已經下載了&#xff0c;那就不用重復下載了。如果還沒有下載&#xff0c;那么&#xff0c;請大家點擊下方鏈接&#xff0c;來了解下載本項目的CPU源代碼的方法。 CSDN文章&#xff1a;下載本項目代碼 上述鏈接為本項目…

Spring Boot 和微服務:快速入門指南

&#x1f496; 歡迎來到我的博客&#xff01; 非常高興能在這里與您相遇。在這里&#xff0c;您不僅能獲得有趣的技術分享&#xff0c;還能感受到輕松愉快的氛圍。無論您是編程新手&#xff0c;還是資深開發者&#xff0c;都能在這里找到屬于您的知識寶藏&#xff0c;學習和成長…