6.異常處理

6.異常處理

1.體系結構

java.lang.Object

|----java.lang.Throwable

|-------java.lang.Error:錯誤,java程序對此無能為力,不顯式的處理

|-------java.lang.Exception:異常。需要進行處理

|------RuntimeException:運行時異常

|-----ArrayIndexOutOfBoundsException/NullPointerException/ArithmeticException/ClassCastException

|------非RuntimeException:編譯時異常

2.因為java程序分為javac.exe和java.exe兩個過程,在每個過程中,都有可能出現異常。故分為編譯時異常、運行時異常

2.1 對於運行時異常比較常見,可以不顯式的來處理。

2.2 對於編譯時異常,必須要顯式的處理

編譯時異常,不是說有異常才處理,而是存在異常的隱患,必須在編譯前,提示程序,萬一出現異常,如何處理!

2.如何處理異常?

java 中的“抓拋模型”

* 1."拋":當我們執行代碼時,一旦出現異常,就會在異常的代碼處生成一個對應的異常類型的對象,並

* 將此對象拋出。(自動拋出 / 手動拋出)

* >一旦拋出此異常類的對象,那麼程序就終止執行

* >此異常類的對象拋給方法的調用者。

* 2."抓":抓住上一步拋出來的異常類的對象。如何抓?即為異常處理的方式

* java 提供了兩種方式用來處理一個異常類的對象。

* 處理的方式一:

* try{

* //可能出現異常的代碼

* }catch(Exception1 e1){

* //處理的方式1

* }catch(Exception2 e2){

* //處理的方式2

* }finally{

* //一定要執行的代碼

* }

* 注:1.try內聲明的變量,類似於局部變量,出了try{}語句,就不能被調用

* 2.finally是可選的。

* 3.catch語句內部是對異常對象的處理:

* >getMessage(); printStackTrace();

* 4.可以有多個catch語句,try中拋出的異常類對象從上往下去匹配catch中的異常類的類型,一旦滿足

* 就執行catch中的代碼。執行完,就跳出其後的多條catch語句

* 5.如果異常處理了,那麼其後的代碼繼續執行。

* 6.若catch中多個異常類型是"並列"關係,孰上孰下都可以。

* 若catch中多個異常類型是"包含"關係,須將子類放在父類的上面,進行處理。否則報錯!

* 7.finally中存放的是一定會被執行的代碼,不管try中、catch中是否仍有異常未被處理,以及是否有return語句。

* 8.try-catch是可以嵌套的。

處理方式二:

在方法的聲明處,顯式的使用throws + 異常類型

public void method1() throws Exception1 e1,Exception2 e2{
//可能出現異常(尤其是編譯時異常,一定要處理)
}

public void method2() throws Exception1 e1,Exception2 e2{
method1();
}
public void method3(){
try{
method2();
}catch(Exception1 e1){
System.out.println(e1.getMessage());
}catch(Exception2 e2){
System.out.println(e2.getMessage());
}
}
public static void main(String[] args){
對象1.method3();//不會再出現上述的Exception1和Exception2的異常!
}

3.如何手動的拋出一個異常?

在方法的內部,可以使用 throw + 異常類對象,來手動的拋出一個異常!

//比較兩個圓的半徑的大小。

public int compareTo(Object obj) throws Exception{
if(this == obj){
return 0;
}
else if(obj instanceof Circle){
Circle c = (Circle)obj;
if(this.radius > c.radius){
return 1;
}else if(this.radius == c.radius){
return 0;
}else{
return -1;
}
}else{
//return -2;
//手動的拋出一個異常
//throw new Exception("傳入的類型有誤!");
//throw new String("傳入的類型有誤!");
throw new MyException("傳入的類型有誤!");

}
}

4.如何自定義一個異常類?

>手動的拋出一個異常,除了拋出的是現成的異常類的對象之外,還可以拋出一個自定義的異常類的對象!

>如何自定義一個異常類呢?

//1.自定義的異常類繼承現有的異常類

//2.提供一個序列號,提供幾個重載的構造器

public class MyException extends Exception{
static final long serialVersionUID = -70348975766939L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}

5.“5個關鍵字搞定異常處理!” 其中,要區分:throw與throws的區別?


分享到:


相關文章: