Java中的異常處理 public static void main(String[] args) { try{ System.out.println(c
1.異常的概念
首先我們在講解異常的時候先回想一下我們以前寫過是程式碼:
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//計算兩個數的除法
public static void main(String[] args) {
int a=10;
int b=5;
System.out.printf("a/b="+a/b);
}
}
在這個程式中我們是做兩個數的除法,那麼我們知道的是此時兩個已知的數中 除數不為0,但是在正常情況下,如果是使用者輸入兩個數做除法,這個時候很有可能就會出現除數為0的情況,這個時候我們用到的解決方法就是用if判斷,如果出現這種情況那麼就不執行運算,否則進行運算。
將這個處理問題的方法,就叫做拋異常。我們的異常就是在你編寫的程式碼在執行的時候可能會出現的隱患問題,這個時候我們就需要對異常進行處理。
2.異常的分類
這兩類異常都是繼承Exception異常的,它們一個叫做檢查異常、一個叫做執行時異常。
3.異常帶來的問題
如果一個程式中有異常,那麼這個程式執行到會出現異常的地方就會中斷。
(1)正常情況
package com.bittech.sthrow; /** * Author:WSChase * Created:2018/11/28 */ public class Throw1 { //計算兩個數的除法 public static void main(String[] args) { System.out.println("計算開始"); System.out.println(10/2); System.out.println("計算結束"); } }
如果沒有出現異常那麼這個程式將會正常進行。
(2)異常情況
package com.bittech.sthrow; /** * Author:WSChase * Created:2018/11/28 */ public class Throw1 { //計算兩個數的除法 public static void main(String[] args) { System.out.println("計算開始"); System.out.println(10/0); System.out.println("計算結束"); } }
當我們的除數為0的時候就會出現異常,這個時候程式就會中斷。
4.處理異常
異常處理的語法格式如下:
try{
可能出現異常的語句;
}[catch(異常類 物件){
}...]
[finally {
異常的出口
}]
這個格式可以組合為三種處理異常的形式:
(1)try…catch
(2)try…finally
(3)try…catch…finally
(1)
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//計算兩個數的除法
public static void main(String[] args) {
System.out.println("計算開始");
try{
System.out.println(10/0);
}catch (ArithmeticException e){
System.out.println(e.getMessage());
System.out.println("除數不能為0");
}
System.out.println("計算結束");
}
}
使用第一種情況就是將異常丟擲並且使用了catch捕獲。
(2)
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//計算兩個數的除法
public static void main(String[] args) {
System.out.println("計算開始");
try{
System.out.println(10/0);
}
finally {
System.out.println("異常處理結束");
}
System.out.println("計算結束");
}
}
(3)
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//計算兩個數的除法
public static void main(String[] args) {
System.out.println("計算開始");
try{
System.out.println(10/0);
}catch (ArithmeticException e){
System.out.println(e.getMessage());
System.out.println("除數不能為0");
}
finally {
System.out.println("異常處理結束");
}
System.out.println("計算結束");
}
}
對於上面結果我們總結以下幾點:
1.catch中的異常的物件是虛擬機器例項化的
2.獲取異常的資訊:e.getMessage();–>這是個字串,賦值給字串列印
3.finall{} 都會執行除去:
(1)如果在finall塊執行之前呼叫System.exit(),VM停止
(2)未知錯誤(如:斷電,硬體損壞)
(3)finall塊在return之後執行(所以注意:在finally塊裡面不要加入return語句,否則會改變原來return的語句)
5.獲取異常資訊
public static void main(String[] args) {
System.out.println("計算開始");
try {
System.out.println("計算中:" + 10 / 0);
} catch (ArithmeticException e) {
e.printStackTrace();//獲取異常資訊
}
System.out.println("計算結束");
}
6.多個catch語句
public static void main(String[] args) {
//採用初始化引數進行數學運算
System.out.println("1.計算開始");
try {
Integer x = Integer.parseInt(args[0]);//字串轉化為整數
Integer y = Integer.parseInt(args[1]);
System.out.println("2.進行計算:" + x / y);
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
System.out.println("不管是否產生異常都會執行這個語句");
}
System.out.println("計算結束");
}
}
對於上面的運算是通過初始化引數進行數學運算的,這個運算中可能會出現很多的異常:
沒有輸入初始化引數、輸入的不是數字、除數為0。
下面我們對這多個異常進行處理:
public static void main(String[] args) {
//採用初始化引數進行數學運算
System.out.println("1.計算開始");
try {
Integer x = Integer.parseInt(args[0]);//字串轉化為整數
Integer y = Integer.parseInt(args[1]);
System.out.println("2.進行計算:" + x / y);
} catch (ArithmeticException e) {//除數為0
e.printStackTrace();
} catch (NumberFormatException e){//輸入的不是數字
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e){//陣列下標越界(沒有給引數)
e.printStackTrace();
}
finally {
System.out.println("不管是否產生異常都會執行這個語句");
}
System.out.println("計算結束");
}
}
(1)輸入一個引數(陣列下標越界)
(2)輸入的不是數字
(3)除數為0
上面是對於多個異常出現時候的處理方法,可以將catch放在一起。
我們之所以有異常處理是因為,之前我們處理這些問題的時候都是用if else處理的,但是如果用這條件判斷去處理的話就會存在一個問題就是不管你有沒有出現異常在程式執行的時候都會去載入條件判斷中的語句,這樣的就會降低效率,所以我們才有異常,但是並不是說所有的情況都需要異常,這個需要根據實際情況判斷。
7.throws關鍵字–>修飾方法
我們在方法定義中也可能會出現異常,這個時候我們可以告訴呼叫者這個方法可能產生異常,可以使用throws進行宣告。這個時候在這個方法中我們不需要對異常進行處理,只是將異常丟擲去了。
public static void main(String[] args) {
try{
System.out.println(calculate(10,0));//呼叫存在異常的這個方法,那麼就需要處理這個異常
}catch(Exception e){
e.printStackTrace();
}
}
public static int calculate(int x,int y) throws Exception{//在這個方法中只進行了丟擲異常
return x/y;
}
}
8.throw關鍵字
throw關鍵字是直接編寫在語句中的拋異常。
public static void main(String[] args) {
try{
throw new Exception("丟擲異常");
}catch(Exception e){
e.printStackTrace();
}
}
}
throw是人工進行丟擲異常,通過我們自己產生異常物件。
對上面的throws和throw進行總結:
注意1:throws拋異常,不處理那麼就是誰呼叫這個方法設就處理,如果呼叫這個方法的時候還是不處理
那麼就是main方法處理,當我們的main方法也不處理繼續throw的時候,就有虛擬機器處理,它的處理方式就是關閉程式。
注意2:寫異常的時候,我們遵循一個原則:從子類到父類
注意3:解釋Exception和RuntimeException的區別並列舉幾個常見的RuntimeException:(面試考點)
- 使用Exception是RuntimeException的父類,使用Exception定義的異常中的IOException(檢查異常)都要求必須使用異常處理
(不管是在哪進行處理),而使用RuntimeException(執行時異常)定義的異常可以由使用者選擇性的來進行異常處理,不使用try{}catch(){}
也可以執行。 - 常見的RuntimeException:ClassCastException、NullPointerException、MysqlException等。