Java中的異常

来源:https://www.cnblogs.com/cjm09/archive/2018/08/14/9465574.html
-Advertisement-
Play Games

在程式運行時,發生了期望之外的情況,它阻止了程式按照程式員的預期正常執行,這就是異常。 對於異常,Java提供了優秀的解決辦法:異常處理機制。常處理機制能讓程式在異常發生時,按照代碼的預先設定的異常處理邏輯,針對性地處理異常,讓程式盡最大可能恢復正常並繼續執行,且保持代碼的清晰。 Java中的異常可 ...


  在程式運行時,發生了期望之外的情況,它阻止了程式按照程式員的預期正常執行,這就是異常。

  對於異常,Java提供了優秀的解決辦法:異常處理機制。常處理機制能讓程式在異常發生時,按照代碼的預先設定的異常處理邏輯,針對性地處理異常,讓程式盡最大可能恢復正常並繼續執行,且保持代碼的清晰。

  Java中的異常可以是函數中的語句執行時引發的,也可以是程式員通過throw語句手動拋出的。只要在Java程式中產生了異常,JVM就會創建一個對象,將異常的具體信息保存到這個對象中,通過throw關鍵字將這個對象拋出去。如果這個函數中書寫了處理異常的代碼,就執行這個代碼;如果沒有,就將這個異常返回給函數的調用者,並結束這個函數。如果函數的調用者書寫了處理異常的代碼,就執行這個代碼;如果沒有,就將異常發生的位置也保存到對象中,然後將對象繼續向上一級拋出。如果一直沒有處理異常的代碼,最終這個對象就會拋給JVM。JVM就會將對象中保存的異常信息輸出到控制台,然後結束程式。

異常的體系和分類:

     

從圖中可以看到,Throwable類是所有錯誤和異常的頂層父類。

錯誤:Error類及其子類,一般是JVM自身的錯誤(系統錯誤),程式員通過代碼無法處理。因此我們一般要關心能夠通過代碼處理的Exception類及其子類。

異常:Exception類及其子類,一般是程式運行時發生的不被期望的事情。可以被Java異常處理機制處理。

Exception類又分為運行異常類(非檢查異常類)和非運行異常類(可檢查異常類)。

RuntimeExcetion類及其子類是運行異常類(非檢查異常)。它是在程式運行時有解釋器引發的各種異常,可以發生在任何地方且出現頻率很高。因此為了避免巨大的系統資源開銷,編譯器不會對這類異常進行檢查。對於這類異常我們可以編寫代碼處理,也可以不處理。這類異常出現,一般是我們的代碼寫的有問題,可以通過修正代碼來避免。如算術異常(除0)ArithmeticExecption,類型強制轉換錯誤 ClassCastException,空指針異常 NullPointerException,角標越界異常 ArrayIndexOutOfBoundsException等等。

除RuntimeException類及其子類外,Exception類的其他子類都是非運行異常(可檢查異常)。它在編譯的時候就會由編譯器進行檢查。這類異常必須進行異常處理,如果不處理,則編譯不通過。這類異常是由於程式可能被運行在各種未知的環境下,而程式員無法干預用戶如何使用他編寫的程式,於是程式員就應該為這樣的異常時刻準備著。這類異常有SQLException , IOException,ClassNotFoundException 等。

處理異常的方式:

在Java編寫代碼處理可檢查異常時,有兩種處理方式。

1、通過Throws關鍵字聲明可能發生的異常,交給函數的調用者去處理。

2、通過try{ } catch{ } finally { } 語句來捕捉並處理異常。

需要註意的是:

1、當聲明異常時,

如果一個函數中會拋出多個異常,每一個異常都要處理;

也可以聲明一個它們共同的父類;

2、當捕捉異常時,

如果有多個異常,要多次分別捕獲,分別處理;使用多個catch

如果處理代碼一樣,可以使用一個catch捕獲;

如果同一個try塊下的多個catch異常類型有父子關係,應該將子類異常放在前面,父類異常放在後面,這樣保證每個catch塊都有存在的意義。

 

finally塊不管異常是否發生,只要對應的try執行了,則它一定也執行。只有一種方法讓finally塊不執行:System.exit()。因此finally塊通常用來做資源釋放操作:關閉文件,關閉資料庫連接等等。

在同一try...catch...finally塊中 ,如果try中拋出異常,且有匹配的catch塊,則先執行catch塊,再執行finally塊。如果沒有catch塊匹配,則先執行finally,然後去外面的調用者中尋找合適的catch塊。

在同一try...catch...finally塊中 ,try發生異常,且匹配的catch塊中處理異常時也拋出異常,那麼後面的finally也會執行:首先執行finally塊,然後去外圍調用者中尋找合適的catch塊。

繼承中方法重寫的異常:

子類重寫的函數不能比父類中的函數聲明更多的編譯異常且只能聲明這個異常或者它的子異常;

重寫函數聲明運行時異常,對方法重寫沒有影響。

自定義異常:

 在Java中已經已經有了一些異常類來描述程式中常出現的問題。除此之外,我們還可以自定義異常。

步驟:

1、自定義一個異常類,繼承ExceptionRuntimeException;

2、給這個類提供一個構造函數,在構造函數中用super調用父類有參函數。


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

-Advertisement-
Play Games
更多相關文章
  • cropperjs的高度過大(container height too much) ...
  • 近幾年的的微服務概念大火特火,隨之框架也變得大火起來,尤其是spring boot,可能是因為spring cloud火起來的原因 搞得沉寂多年的dubbo也開始更新變得火起來。 說起微服務對於不瞭解整個系統架構歷史的小伙伴可能有些迷惑,怎麼就突然一下子就微服務了,有點摸不著頭腦,到底咋回事那?聽我 ...
  • 《劍指offer》: 首先熟悉一下java自帶的進位之間轉換的api: /*java中進行二進位,八進位,十六進位,十進位間進行相互轉換十進位轉成十六進位:Integer.toHexString(int i)十進位轉成八進位Integer.toOctalString(int i)十進位轉成二進位In ...
  • 問題:通常會遇到這樣一個問題,就是svn伺服器不能以SVN 協議訪問,而只能用https協議訪問。 主要原因是svn服務端集成了apache的安裝包,安裝後自動配置成了http協議訪問。如果需要svn協議訪問,則需要重新架設svn版本管理伺服器,不能集成apache,使用純svn安裝包即 “ sub ...
  • zendstudio 10.0破解版,新建完項目後,首先修改項目的編碼方式,統一改成utf-8 (選中項目,再右鍵properties:Text file encoding)。修改字體大小。 apache 安裝:httpd-2.2.17-win32,安裝成功後訪問apache伺服器:http://1 ...
  • 1. Java 中File類的createNewFile()與createTempFile()的區別 最近,在看代碼時看到了一個方法, File.createTempFile() ,由此聯想到File.createNewFile() 方法,一時間不知道兩者到底有什麼區別,感覺都是創建新文件嘛,後來查 ...
  • You can do this using a JLabel, but an alternative would be to style a JButton. That way, you don't have to worry about accessibility and can just fir ...
  • String examplejsPrefix = "example"; String examplejsSuffix = "js"; String examplejs = examplejsPrefix + "." + examplejsSuffix; try { // save it as a t ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...