1. 程式人生 > >JAVA之自定義異常

JAVA之自定義異常

1:什麼是異常

異常

1. JVM預設是如何處理異常的

        *main函式收到這個問題時,有兩種處理方式:

        *a:自己將該問題處理,然後繼續執行

        *b:自己沒有針對的處理方式,只有交給呼叫main的jvm來處理

        *jvm有一個預設的異常處理機制,就將該異常進行處理.

      * 並將該異常的名稱,異常的資訊.異常出現的位置列印在了控制檯上,同時將程式停止執行

2. 異常處理的兩種方式 

    1)  try…catch…finally

               有3種組合: trycatch   ;  try catch finally  ;  try finally

try:用來檢測異常的;catch:用來捕獲異常的;finally:釋放資源

        2)  throws

3. 處理多個異常 

/*

 *try...catch的方式處理多個異常

 *try後面如果跟多個catch,那麼小的異常放前面,大的異常放後面,根據多型的原理,

 * 如果大的放前面,就會將所有的子類物件接收後面的catch就沒有意義了.

 */

開發中只簡單寫catch(Exception e)。

開發中的應用:

1)客戶端開發,如何處理異常?try{}catch(Exceptione){}

2)服務端開發,一般都是底層開發,從底層向上拋。

4. 編譯時異常和執行時異常的區別

        Java中的異常被分為兩大類:編譯時異常和執行時異常。所有的RuntimeException類及其子類的例項被稱為執行時異常,其他的異常就是編譯時異常。

編譯時異常:在編譯某個程式的時候,有可能會有這樣那樣的事情發生,比如檔案找不到,這樣的異常就必須在編譯的時候處理,如果不處理編譯通不過。

執行時異常:就是程式設計師所犯得錯誤,需要回來修改程式碼

簡單的說:

        編譯時異常:Java程式必須顯示處理,否則程式就會發生錯誤,無法通過編譯

        執行時異常:無需顯示處理,也可以和編譯時異常一樣處理

5. throw的概述以及和throws的區別  

1)throw的概述

        在功能方法內部出現某種情況,程式不能繼續執行,需要進行跳轉時,就用throw把異常物件丟擲。

2)throws和throw的區別

        *throws

                *用在方法聲明後面,跟的是異常類名

                *可以跟多個異常類名,用逗號隔開

                *表示丟擲異常,由該方法的呼叫者來處理

        *throw

                *用在方法體內,跟的是異常物件名

                *只能丟擲一個異常物件名

                *表示丟擲異常,由方法體內的語句處理

6. 為什麼需要自定義異常?通過名字區分到底是神馬異常,有針對的解決辦法

                *自定義異常概述

                *繼承自Exception

                *繼承自RuntimeException

7. 異常注意事項

         a:子類重寫父類方法時,子類的方法必須丟擲相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)

         b:如果父類丟擲了多個異常,子類重寫父類時,只能丟擲相同的異常或者是他的子集,子類不能丟擲父類沒有的異常

         c:如果被重寫的方法沒有異常丟擲,那麼子類的方法絕對不可以丟擲異常,如果子類方法內有異常發生,那麼子類只能try,不能throws

8. 如何使用異常處理

原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由呼叫者處理,這是用throws

區別:

        後續程式需要繼續執行就try

        後續程式不需要繼續執行就throws

2:兩個自定義異常栗子

 注意:java中允許使用者自定義異常,但自定義的異常必須繼承Exception或其子類

The one

package henu.rjxy.exception;


/*
 * 為什麼需要自定義異常
 * 通過名字區分到底是什麼異常,有針對的解決辦法 
 * 
 * 自定義異常概述
 * 繼承自Exception
 * 繼承自RuntimeException
 */


public class Demo06 {


public static void main(String[] args) {


try {
System.out.print(divide(10, -2));

} catch(DivideByMinusException e) {
System.out.println("異常資訊:" + e.getMessage());


System.out.println("程式繼續執行。。。");
}


public static int divide(int x, int y) throws DivideByMinusException {
if (y<0) {
throw new DivideByMinusException("除數是負數");
}
return x / y;       
}

}


class DivideByMinusException extends Exception {
public DivideByMinusException() {
super();
}

public DivideByMinusException(String message) {
super(message);
}

}

The two 

package yu;


import java.util.Scanner;
 


public class Main {


/**
* 從鍵盤錄入使用者的姓名和年齡資訊,要求年齡不能為負數,要求用異常處理機制完成本程式。
提示:使用自定義異常類。
*/
public static void main(String[] args) throws AgeException{
Scanner sc=new Scanner(System.in);
System.out.println("請輸入姓名");
String name=sc.nextLine();
System.out.println("請輸入年齡");
int age=sc.nextInt();
sc.close();
System.out.println("姓名:"+name);
System.out.println("年齡:"+theAge(age));


}
public static int theAge(int age) throws AgeException{
if (age<0) {
throw new AgeException("年齡輸入錯誤");
}
return age;
}
 


}
 
class AgeException extends Exception{


public AgeException() {
super();
// TODO Auto-generated constructor stub
}


public AgeException(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}

}