第六章

分類:編程 時間:2017-02-13

什麽是異常?

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

1.體系結構

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 對於編譯時異常,必須要顯式的處理
編譯時異常,不是說有異常才處理,而是存在異常的隱患,必須在編譯前,提示程序,萬一出現異常,如何處理!

註:運行時異常常有以下四種:

   //1.數組下標越界異常:ArrayIndexOutOfBoundsException
    @Test
    public void test2(){
        int[] i = new int[10];
        //system.out.println(i[10]);
        System.out.println(i[-10]);
    }

    //2.算是異常:ArithmeticException
    @Test
    public void test3(){
        int i = 10;
        System.out.println(i / 0);
    }

    //3.類型轉換異常:ClassCastException
    @Test
    public void test4(){
        Object obj = new Date();
        String str = (String)obj;

        //String str1 = (String)new Date();
    }

    //4.空指針異常:NullPointException
    @Test
    public void test5(){
        //Person p = new Person();
        //p = null;
        //System.out.println(p.toString());

        String str = new String("AA");
        str = null;
        System.out.println(str.length());
    }

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的區別?

異常處理綜合練習:

編寫應用程序EcmDef.java,接收命令行的兩個參數,要求不能輸入負數,計算兩數相除。
對數據類型不一致(NumberFormatException)、缺少命令行參數(ArrayIndexOutOfBoundsException、除0(ArithmeticException)及輸入負數(EcDef 自定義的異常)進行異常處理。
提示:
(1)在主類(EcmDef)中定義異常方法(ecm)完成兩數相除功能。
(2)在main()方法中使用異常處理語句進行異常處理。
(3)在程序中,自定義對應輸入負數的異常類(EcDef)。
(4)運行時接受參數 java EcmDef 20 10 //args[0]=“20” args[1]=“10”
(5)Interger類的static方法parseInt(String s)將s轉換成對應的int值。如int a=Interger.parseInt(“314”); //a=314;

public class EcmDef {
    public static void main(String[] args) {
        try{
        int i = Integer.parseInt(args[0]);//被除數
        int j = Integer.parseInt(args[1]);//除數
        ecm(i,j);
        }catch(NumberFormatException e){
            System.out.println("輸入的數據類型不一致");
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("缺少命令行參數");
        }catch(ArithmeticException e){
            System.out.println("分母為零了");
        }catch(EcDef e){
            System.out.println(e.getMessage());
        }
    }
    public static void ecm(int i,int j) throws EcDef{
        if(i < 0 || j < 0){
            throw new EcDef("您輸入的數值存在負數!");
        }
        System.out.println(i / j);
    }
}
//自定義異常類
class EcDef extends Exception{
    static final long serialVersionUID = -3387524229948L;

    public EcDef(){

    }
    public EcDef(String msg){
        super(msg);
    }
}

Tags: java程序 Object public 如何

文章來源:


ads
ads

相關文章
ads

相關文章

ad