异常以及异常处理
異常概述
異常:異常是指在程序的運行過程中所發生的不正常的事件,它會中斷正在運行的程序。簡單來說就是程序出現了不正常的情況。
異常本質就是Java當中對可能出現的問題進行描述的一種對象體現。
常見異常:
除數不能為0異常(ArithmeticException)
空指針異常(NullPointException)
數組越界異常(ArrayIndexOutOfBoundsException)
類型轉換異常(ClassCastException)
異常分類
Error:稱為錯誤,由Java虛擬機生成并拋出,程序對其不做處理。
Exception:所有異常類的父類,其子類對應了各種各樣可能出現的異常事件,一般需要用戶顯示的聲明或捕獲。
RuntimeException:運行時期異常,又稱為非受檢異常,RuntimeException及其所有子類都是運行時期異常。
編譯時期異常:不是繼承自RuntimeException的Exception的子類都稱為編譯時期異常。
嚴重錯誤: 在程序執行的整個階段,都可發生錯誤,錯誤是無法解決的,可以避免,例如: StackOverflow
遇到異常,是如何處理的呢?
處理異常的目的: 并不是為了修復程序的錯誤,而是就算程序出現了錯誤,也能夠讓程序繼續執行
jvm默認是如何處理異常的?
以下段編碼為例:
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
public static void show() {
show();
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.kookv.kookv0425.main(kookv0425.java:8)
1.打印錯誤信息
a.異常名稱 java.lang.ArithmeticException
b.異常的消息 / by zero
c.異常所發生的方法位置 at com.kookv.kookv0425.main
d.異常所在Java文件中 kookv0425.java
e.異常發生行號 8
2.終止程序
System.exit(0);
當JVM處理異常的方式不能夠滿足我們開發的需求,就需要我們自己處理異常。
我們自己如何來處理異常呢?
方式一: try...catch..finally
方式二: throws
處理異常方式一格式:
try{
//程序可能出現問題的代碼
}catch(異常類 異常名){
//異常處理的代碼
} finally{
//釋放資源
}
注意:
1.try塊區的代碼越少越好。
2.try塊中一旦發生異常,那么后面所有的代碼都不會被執行。
3.多個catch塊只會執行一個。
4.Exception接受異常必須放在異常的最后面,滿足先子類后父類。
異常的執行流程:
1.程序執行到錯誤行,系統會創建一個異常對象,并且拋給我們:
ArithmeticException exp = new ArithmeticException("/by zero");
throw exp;
2.程序進入catch塊進行逐個匹配
匹配成功,程序執行catch塊代碼
ArithmeticException ae = exp;
Exception e = exp;
匹配失敗,交給jvm處理
處理異常的標準方式:
1.能夠顯示處理的盡量顯示處理,提高程序的可讀性。
2.但是一定要在異常處理的最后加上 父類Exception處理。
Throwable類
1.Throwable是所有異常和錯誤的父類。
2.只有作為Throwable或者它的子類對象才能夠由Java虛擬機拋出,或者可以由Java throw語句拋出
3.只有這個類或其子類可以是catch子句中的參數類型
4.異常的本質就是對錯誤信息的一種對象體現
throws關鍵字概述
在定義一個方法的時候可以使用throws關鍵字聲明,使用throws聲明的方法表示此方法不處理異常,而交給方法的調用者進行處理。
throws使用格式
[修飾符] 返回值類型 方法名(參數列表) [throws 異常類1,異常類2....]{
}
注意:
1.在main方法中,不能throws拋出。因為main方法是虛擬機調用,虛擬機處理異常的結果是將程序終止,不滿足我們對處理異常的本質需求。
2.當一個方法拋出的是編譯時異常,調用者必須處理。
3.throws可以同時聲明多個異常。
4.當一個父類方法拋出一個異常,重寫方法不能夠被擴大。
5.throws表示異常出現的一種可能性。
6.多個平級異常的處理方式:使用“,”隔開多個異常。
throw和throws的區別
有了throws關鍵字為什么需要throw? -- 異常出現的情況做相應的處理,throws只是一種異常的聲明
拋出異常對象: throw 異常對象;
throws和throw的區別:
1.throws出現方法的聲明上,throw出現在方法體內。
2.throws表示異常出現的一種可能性,throw表示方法一定出現了異常。
3.throws可以聲明很多個異常,throw只能夠拋出一個異常對象。
4.throws聲明的是異常類,throw拋出的是異常對象。
finally修飾的代碼塊一定會被執行,除非在執行到finally之前程序異常退出或者調用了系統退出的方法。
finally用于釋放資源,在IO流操作和數據庫操作中會見到。
finally相關的面試題
簡述final,finally和finalize的區別。
finally碰到return
finally一定會執行
執行順序?
在try語句中,在執行return語句時,要返回的結果已經準備好了,就在此時,程序轉到finally執行了。
在轉去之前,try中先把要返回的結果存放到不同于x的局部變量中去,執行完finally之后,在從中取出返回結果。
因此,即使finally中對變量x進行了改變,但是不會影響返回結果。它應該使用棧保存返回值。
為什么需要自定義異常?
1.系統提供的異常不能滿足我們的所有需求。
2.我們認為的異常并不是和別人認為的異常一樣,本質就是一種錯誤異常。
自定義分數異常: 自定義一個異常,要求考試成績必須在0-100之間,如果不在這個范圍內,拋出異常。
自定義異常的步驟
1.自定義異常必須是Throwable的子類,但又因為錯誤不能夠處理,所以我們一般繼承Exception或者RuntimeExecption
2.書寫構造方法
a.無參構造方法
b.帶message消息的有參數構造方法
轉載于:https://juejin.im/post/5cc19911f265da039b0872ee
總結
- 上一篇: 利用CSS变量实现炫酷的悬浮效果
- 下一篇: reactivecocoa基础讲解