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
}
}