摘要:對異常的處理方法是打印異常的跟蹤棧信息并終止程序運行。應盡量對異常進行適當的處理,而不是簡單的將異常跟蹤棧信息打印出來。
一、異常概述
開發者都希望所有錯誤都能在編譯階段被發現,就是試圖在運行程序之前排除所有錯誤,但這是不現實的,余下問題必須在運行期間得到解決。 Java將異常分為兩種:CheckedException和RuntimeException。其中,CheckedException都是可以在編譯期間被處理的異常,而RuntimeException異常則無需處理。 增加了異常處理機制后的程序有更好的容錯性,更健壯。二、異常處理機制
Java異常處理機制可以讓程序有更好的容錯性,讓程序更健壯。異常處理機制可以實現將“業務功能實現代碼”和“錯誤處理代碼”分離,提供更好的可讀性。
1.使用try...catch...捕獲異常
把系統業務實現代碼放在try塊中定義,所有異常處理邏輯放入catch塊中進行處理。下面是Java異常處理機制的語法結構:
如果執行try塊里的業務邏輯代碼出現異常,系統自動生成一個異常對象,該異常對象被提交給Java運行時環境,這個過程被稱為拋出異常。
當Java運行時環境收到異常對象時,會自動尋找能處理該異常對象的catch塊,如果找到合適的catch塊,則把該異常對象交給該catch塊處理,這個過程被稱為捕獲異常。
提示:1.如果程序沒有為這段代碼定義任何的catch塊,則Java運行環境無法找到處理該異常的catch塊,程序就在此退出。
2.try塊中聲明的變量是代碼塊內局部變量,它只在try塊中有效,在catch塊中不能訪問該變量。
2.異常類的繼承體系
Java把所有非正常情況分為:異常(Exception)和錯誤(Error)他們都繼承Throwable父類。 Error錯誤:一般是指與虛擬機相關的錯誤,如系統崩潰、虛擬機錯誤、動態鏈接失敗等。這種錯誤無法恢復和不可能捕獲,將導致應用程序中斷。 進行異常捕獲時,應遵循先處理小異常,再處理大異常。
3.Java7提供的多異常捕獲
從Java7開始,一個catch塊可以捕獲多種類型異常。 應注意以下2個地方: 1)捕獲多個類型的異常時,多種異常類型應用豎線(|)隔開。 2)捕獲多個類型的異常時,異常變量有隱式的final修飾,因此程序不能對異常變量重新賦值。
4.使用finally回收資源
有時候,程序在try塊中打開了一些物理資源(例如數據庫連接等), 這些都必須顯式回收。為了保證一定能回收try塊中打開的物理資源,異常處理機制提供了finally語句塊。不論try塊中代碼是否出現異常,也不管哪一個catch塊被執行,甚至try塊或catch塊中執行了return語句,finally塊總會被執行。但如果在try塊或catch塊中使用System.exit(1)語句退出虛擬機,則finally塊將失去執行機會。 完整的Java異常處理語法結構如下:
通常情況下,不要在finally塊中使用如 return或throw等導致方法終止的語句,一旦在finally塊中使用此類語句,將導致try塊、catch塊中的return或throw語句失效。
5.自動關閉資源的try語句
允許在try塊關鍵字后緊跟一對圓括號,圓括號可以聲明、初始化一個或多個資源,此處的資指的是那些必須在程序結束時顯示關閉資源(如數據庫連接,網絡連接等),try語句塊在該語句塊結束時自動關閉這些資源。
為保證try語句塊可以正常關閉資源,這些方法必須實現AutoCloseable或Closeable接口,實現這兩種接口就必須實現close()方法。
Java將異常分為兩種:CheckedException和RuntimeException。
對于CheckedException的處理方式有兩種:
1)當前方法知道如何處理該異常,程序使用try...catch...塊來捕獲該異常,然后在其對應的catch塊中處理該異常。
2)當前方法不知道如何處理這種異常,應該在定義方法時聲明拋出該異常。
1.使用throws聲明拋出異常
使用throws聲明拋出異常的思路是:當前方法不知道該如何處理此異常,該異常應該由上一級調用者;如果main()方法也不知道該如何處理此異常,也可用throws聲明拋出異常,該異常將交給JVM處理。JVM對異常的處理方法是:打印異常的跟蹤棧信息,并終止程序運行。這也就是程序遇到異常后自動結束的原因。
throws聲明只能用在方法簽名中,throws可聲明拋出多個異常類,多個異常類之間用逗號(,)隔開。throws聲明語法格式如下:
throws Exception1,Exception2...
一旦使用throws聲明拋出該異常,就無需使用try...catch語句塊來捕獲該異常。
使用throws聲明拋出異常時,有一個限制:子類方法聲明拋出的異常類型應該是父類方法聲明拋出的異常的子類或者相同,子類方法聲明拋出的異常不允許比父類方法聲明拋出的異常多。
2.使用throw拋出異常
如果需要在程序中自行拋出異常,則應使用throw語句,throw語句可多帶帶使用,throw語句拋出的不是異常類,而是一個異常實例,且每次只能拋出一個異常實例。throw語句語法格式如下:
throw ExceptionInstance;
3.自定義異常
用戶自定義異常都應該繼承Exception基類,如果希望自定義Runtim異常,則應繼承RuntimeException基類。自定義異常格式如下:
4.異常鏈
程序捕獲原始異常,然后拋出一個新的業務異常,新的業務異常中包含了對用戶的提示信息,這種處理方式稱為異常轉譯。
這種把原始信息隱藏起來,僅向上提供必要的異常提示信息的處理方式,可以保證底層異常不會擴散到表現層,可以避免向上暴露太多的實現細節,符合面向對象的封裝原則。
這種把捕獲一個異常然后緊接著拋出另一個異常,并把原始異常信息保存下來的方式是一種典型的鏈式處理,也被稱為異常鏈。
四、Java的異常跟蹤棧異常對象的printStackTrace()方法用于打印異常的跟蹤棧信息,根據printStackTrace()方法的輸出結果,可以找到異常的源頭,并跟蹤到異常的一路觸發過程。應盡量對異常進行適當的處理,而不是簡單的將異常跟蹤棧信息打印出來。
五、異常處理規則1.不要過度使用異常
2.不要使用過于龐大的try塊
3.避免使用catchAll語句
4.不要忽略捕獲到的異常
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70192.html
摘要:不受檢查異常為編譯器不要求強制處理的異常,檢查異常則是編譯器要求必須處置的異常。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當運行時系統遍歷調用棧而未找到合適的異常處理器,則運行時系統終止。異常處理涉及到五個關鍵字,分別是。 概念 程序運行時,發生的不被期望的事件,它阻止了程序按照程序員的預期正常執行,這就是異常。 異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并...
摘要:根據異常對象判斷是否存在異常處理。否則,范圍小的異常會因異常處理完成而無法處理。異常處理中使用作為異常的統一出口。 參考《第一行代碼java》《java程序設計教程》java中程序的錯誤有語法錯誤、語義錯誤。如果是語法性錯誤,在編譯時就可以檢查出來并解決。語義錯誤是在程序運行時出現的,在編譯時沒有錯誤,但在運行時可能會出現錯誤導致程序退出,這些錯誤稱為異常。在沒有異常處理的情況下,也即...
摘要:異常發生時如何處理,提供了解決辦法異常處理機制。只要在程序中產生了異常,就會用一個對應類型的異常對象來封裝異常,會試圖尋找異常處理程序來處理異常。中,異常處理的任務就是將執行控制流從異常發生的地方轉移到能夠處理這種異常的地方去。 前言 概述:異常就是java程序在運行過程中出現的錯誤。 異常發生時如何處理,java提供了解決辦法:異常處理機制。 java中的異常可以是函數中的語句執行...
捕獲和處理異常 本節描述如何使用三個異常處理程序組件 — try、catch和finally塊 — 來編寫異常處理程序,然后,解釋了Java SE 7中引入的try-with-resources語句,try-with-resources語句特別適用于使用Closeable資源的情況,例如流。 本節的最后一部分將介紹一個示例,并分析各種場景中發生的情況。 以下示例定義并實現名為ListOfNumbe...
閱讀 813·2023-04-25 22:57
閱讀 3062·2021-11-23 10:03
閱讀 624·2021-11-22 15:24
閱讀 3169·2021-11-02 14:47
閱讀 2912·2021-09-10 11:23
閱讀 3130·2021-09-06 15:00
閱讀 3953·2019-08-30 15:56
閱讀 3337·2019-08-30 15:52