學習日志之異常
異常(異常的概述和分類)
A:異常的概述
異常就是Java程序在運行過程中出現的錯誤。異常指不期而至的各種狀況,如:文件找不到、網絡連接失敗、非法參數等。異常是一個事件,它發生在程序運行期間,干擾了正常的指令流程。
B:異常的分類
Java通過API中Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是對象,是Throwable子類的實例。
通過API查看Throwable
Error
是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題,服務器宕機,數據庫崩潰等
Exception
是程序本身可以處理的異常。
注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
C:異常的繼承體系
Throwable
Error
Exception
RuntimeException
注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
JVM默認是如何處理異常的
main函數收到這個問題時,有兩種處理方式:
a:自己將該問題處理,然後繼續運行
b:自己沒有針對的處理方式,只有交給調用main的jvm來處理
jvm有一個默認的異常處理機制,就將該異常進行處理.
並將該異常的名稱,異常的信息.異常出現的位置打印在了控制台上,同時將程序停止運行
異常(try...catch的方式處理異常1)
A:異常處理的兩種方式
a:try…catch…finally
trycatch
trycatch finally
tryfinally
b:throws
try:用來檢測異常
catch:用來捕獲異常
finally:用來執行必須執行的語句。例如釋放資源。
B:try...catch處理異常的基本格式
try…catch…finally
安卓和J2EE在處理異常的區別:
安卓:因為是客戶端發開,所以通常都是將異常自己私下處理了,以確保APP的能夠繼續運行。但是這樣,異常就會被埋沒了,留下來隱患。
J2EE:因為是服務端開發,一般都是底層開發,所以異常就不可私自處理掉而留下隱患。而是將問題向上拋出,以生成日志文件。
C:案例演示
try...catch的方式處理1個異常
try { int x = 10,y = 0; int c = x / y; }catch (Exception e) { System.out.priintln(e); }
異常(try...catch的方式處理異常2)
A:案例演示
try...catch的方式處理多個異常
try { 語句1;//發生異常A ,實際運行時,程序運行到這裡就發生異常被捕獲,所以下面的語句2語句3以及捕獲它們的catch語句都不會執 //行了
語句2;//發生異常B 語句3;//發生異常 C }catch(ExceptionA) { System.out.println("異常A"); }catch(ExceptionB) { System.out.println("異常B"); }catch(ExceptionC) { System.out.println("異常C"); }
發生異常A ,實際運行時,程序運行到這裡就發生異常被捕獲,所以下面的語句2語句3以及捕獲它們的catch語句都不會執行了。
所以try後面的catch,小的異常放在前面,大的異常放後面。因為根據多態原理,大的異常會接受左右子類的對象,從而將異常吃掉,就沒法知道到底發生了具體什麼異常了。
JDK7以後處理多個異常的方式及注意事項
try{ 語句1;//發生異常A 語句2;//發生異常B }catch(ExceptionA | ExceptionB) { }
異常(編譯期異常和運行期異常的區別)
通常,Java的異常(包括Exception和Error)分為可查的異常(checkedexceptions)和不可查的異常(unchecked exceptions)。
可查異常(編譯器要求必須處置的異常):
正確的程序在運行中,很容易出現的、情理可容的異常狀況。可查異常雖然是異常狀況,但在一定程度上它的發生是可以預計的,而且一旦發生這種異常狀況,就必須采取某種方式進行處理。
除了RuntimeException及其子類以外,其他的Exception類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,否則編譯不會通過。
不可查異常(編譯器不要求強制處置的異常):包括運行時異常(RuntimeException與其子類)和錯誤(Error)。
不可查異常在編譯的時候不會被發現,也就是編寫代碼的時候不需要拋出或處理,當程序執行的時候出現的話,程序直接停下來。
可查的異常就是在寫代碼的時候必須要處理或拋出的,如果不處理或拋出就會出現紅色報警。
Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程序中應當盡可能去處理這些異常。
運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。
運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
非運行時異常(編譯異常):是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常
異常(Throwable的幾個常見方法)
A:Throwable的幾個常見方法
a:getMessage()
獲取異常信息,返回字符串。
b:toString()
獲取異常類名和異常信息,返回字符串。
c:printStackTrace()
獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。
B:案例演示
Throwable的幾個常見方法的基本使用
異常(throws的方式處理異常)
A:throws的方式處理異常
定義功能方法時,需要把出現的問題暴露出來讓調用者去處理。
那麼就通過throws在方法上標識。
Throws拋出異常的規則:
1) 如果是不可查異常(unchecked exception),即Error、RuntimeException或它們的子類,那麼可以不使用throws關鍵字來聲明要拋出的異常,編譯仍能順利通過,但在運行時會被系統拋出。
2)必須聲明方法可拋出的任何可查異常(checked exception)。即如果一個方法可能出現受可查異常,要麼用try-catch語句捕獲,要麼用throws子句聲明將它拋出,否則會導致編譯錯誤
3)僅當拋出了異常,該方法的調用者才必須處理或者重新拋出該異常。當方法的調用者無力處理該異常的時候,應該繼續拋出,而不是囫囵吞棗。
B:案例演示
void method() throws ExceptionA {
if(true)
throws new ExceptionA();
}
異常(throw的概述以及和throws的區別)
A:throw的概述
在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。
B:案例演示
分別演示編譯時異常對象和運行時異常對象的拋出
C:throws和throw的區別
a:throws
用在方法聲明後面,跟的是異常類名
可以跟多個異常類名,用逗號隔開
表示拋出異常,由該方法的調用者來處理
PS:就是一個聲明,告訴別人,自己可能有異常,注意下。
b:throw
用在方法體內,跟的是異常對象名
只能拋出一個異常對象名
表示拋出異常,由方法體內的語句處理
異常(finally關鍵字的特點及作用)
A:finally的特點
被finally控制的語句體一定會執行
特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))
B:finally的作用
用於釋放資源,在IO流操作和數據庫操作中會見到
C:案例演示
finally關鍵字的特點及作用
異常(finally關鍵字的面試題)
A:面試題1
final,finally和finalize的區別
B:面試題2
如果catch裡面有return語句,請問finally的代碼還會執行嗎?如果會,請問是在return前還是return後。
當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。
異常(自定義異常概述和基本使用)
A:為什麼需要自定義異常
為了將異常的具體情況進一步細化。
B:自定義異常概述
繼承自Exception
繼承自RuntimeException
異常(異常的注意事項及如何使用異常處理)
A:異常注意事項
a:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
b:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
c:如果被重寫的方法沒有異常拋出,那麼子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那麼子類只能try,不能throws
B:如何使用異常處理
原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws
區別:
後續程序需要繼續運行就try
後續程序不需要繼續運行就throws
如果JDK沒有提供對應的異常,需要自定義異常。