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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...