在我們日常所看到的代碼中,幾乎所有的都存在異常,爲了保證程序出現異常之後可以正常執行完畢,需要進行異常處理
異常類的繼承結構:
所有的異常都是由Throwable繼承而來,他的兩個子類分別爲Error、Exception
Error類描述的是Java運行時內部錯誤和資源耗盡錯誤,應用程序不拋出此類異常,一旦出現這種內部錯誤,應用程序會告知用戶並使程序安全終止。
Exception的兩個子類分別爲:RuntimeException和IOException
RuntimeException:由於程序錯誤導致的異常
IOException:程序本身沒有問題,由於I/O錯誤之類的錯誤導致的異常
1、異常的影響
異常是導致程序中斷執行的一種指令流,程序之中如果出現異常並且沒有合理處理的話就會導致程序終止只執行
會產生異常的程序
public class Test {
public static void main(String[] args) {
System.out.println("小明要進行數字計算");
System.out.println("小明計算"+10/0);
System.out.println("計算完成");
}
}
異常信息:小明要進行數字計算
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Exception.Test.main(Test.java:8)
2、異常處理
語法:
try{
可能處理異常的語句;
}catch(異常類 對象){
}finally{
異常出口
}
可以使用:try……catch、try……finally、try……catch……finally進行異常處理
public class Test {
public static void main(String[] args) {
System.out.println("小明要進行數字計算");
try {
System.out.println("小明計算"+10/0);
} catch (Exception e) {
System.out.println("異常已經處理");
}
System.out.println("計算完成");
}
}
獲取出現異常的完整信息
public class Test {
public static void main(String[] args) {
System.out.println("小明要進行數字計算");
try {
System.out.println("小明計算"+10/0);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("計算完成");
}
}
異常信息:小明要進行數字計算
java.lang.ArithmeticException: / by zero
計算完成
at Exception.Test.main(Test.java:9)
如果一段代碼中同時出現多個異常,需要使用多個catch塊來捕獲指定異常,這樣會很麻煩,此時引入throws拋出
3、throws關鍵字
throws用在方法之上
public class Test {
//主方法異常拋出,如果產生異常會交給JVM處理
public static void main(String[] args) throws Exception{
System.out.println(calculate(10, 0));
}
public static int calculate(int x,int y) throws Exception {
return x/y ;
}
}
4、throw關鍵字
throw用在方法中,表示人爲進行異常拋出
public static void main(String[] args){
try {
throw new Exception("拋出異常") ;
} catch (Exception e) {
e.printStackTrace();
}
}
解釋throw和throws的區別:
a、throw用於方法內部,表示手工異常拋出
b、throws用於方法聲明上,明確告訴用戶該方法會產生什麼異常,同時可能不處理異常
5、RuntimeException類
範例:
public static void main(String[] args){
String str = "100" ;
int num = Integer.parseInt(str) ;
System.out.println(num * 2);
}
parseInt源碼定義:
public static int parseInt(String s) throws NumberFormatException
可見這個方法已經拋出異常,在調用的時候不進行異常處理也可以正常執行,屬性RuntimeException的範疇
解釋Exception和RuntimeException的區別,並列舉幾個常見的RuntimeException
a、Exception是RuntimeException的父類,使用Exception定義的異常都要求必須使用異常處理
b、使用RuntimeException定義的異常可以由用戶選擇性的來進行異常處理
常見的RuntimeException:ClassCastException、NullPointerException等。
6、自定義異常類
在Java異常中,對於可能出現的公共長鬚問題都會提供相應的異常信息,但是有時候這些異常信息不夠我們使用,此時就要自定義一個異常類
實現自定義異常類:
class AddException extends Exception {
public AddException(String msg) {
super(msg) ;
}
}
public class Test {
public static void main(String[] args) throws Exception{
int num1 = 20 ;
int num2 = 30 ;
if (num1+num2==50) {
//當兩數相加爲50,拋出AddException
throw new AddException("錯誤的相加操作") ;
}
}
}