黑馬程序員_Java基礎[19]_異常、自定義異常

---------- android培訓 java培訓、期待與您交流! ----------
/*

因爲 在項目中會出現特有的問題
而這些問題並未被java所描述並封裝
所以對這些特有的問題可以按照java的對問題封裝的思想
將特有的問題,進行自定義的異常封裝

自定義異常
需求:
在本程序中對於除數是負數-1,也是視爲是錯誤的,是無法進行運算的
那麼就需要對這個問題進行自定義的描述。


當在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
要麼在內部try catch 處理
要麼在函數上聲明讓調用這處理

一般情況在 函數內出現異常,函數上需要聲明.

發現打印的結果中只有異常名稱,卻沒有異常的信息
因爲自定義的異常並未定義信息

如何定義異常信息呢。
因爲父類中已經把異常信息操作都完成了,
所以子類只要在構造時,將一類信息傳遞給父類通過super語句
那麼就可以直接功過getMessage方法獲取自定義的異常。

自定義異常:  必須是自定義類繼承Exception
繼承Exception原因:
    異常體系有一個特點,因爲異常類和異常對象都需要被拋出,
    他們都具備可拋性,這個可拋性是Throwable這個體系中獨有特點
    
    只有這個體系中的類和對象纔可以被throws 和throw 操作。
    
throws和throw區別
throws使用在函數上
throw 使用在函數內

throws 後面跟的是異常類,可以跟多個,用逗號隔開      就是:()這個位置{}
throw  後面跟的是異常對象。

【【異常中的特殊子類異常】】
Exception 中有一個特殊的子類異常RuntimeException 運行時異常
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過
如果在函數上聲明該異常,調用者可以不用進行處理,編譯一樣通過


之所以在函數上聲明,是因爲不需要調用者處理
當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,
    希望停止程序後,由程序員對代碼進行修正。

【m】
自定義的異常時:如果該異常的發生,無法在急促進行運算
就讓自定義類異常繼承RuntimeException

對於異常,分兩種
1、編譯時,被檢測的異常   (方法後需要拋出異常。)
2、編譯時,不被檢測的異常(運行時的異常就是RuntimeException異常)
    方法中拋出了非Run異常或其子類,上面沒有標識,就視爲有安全隱患的。)
【【【【結論:如果自定義異常,要麼繼承Exception要麼繼承RuntimeException】】】】
 */
class FuException extends Exception{
    private int value;
    //這個也可以,裏面有默認的。
    FuException(){
        super();
    }
    FuException(String msg,int value){
        super(msg);
        this.value=value;
    }
    public int getValue(){
        return value;
    }
    
/*    【m】
}
class FuException extends RuntimeException{
    private int value;
    //這個也可以,裏面有默認的。
    FuException(){
        super();
    }
    FuException(String msg,int value){
        super(msg);
        this.value=value;
    }
    public int getValue(){
        return value;
    }
    
class Demo_3{
    int div(int a,int b) //這裏不在需要聲明
    {
        if(b <0){
            throw new FuException("出現負數",b);//手動通過throw 關鍵字拋出一個自定義的異常
        }
        if(b =0){
            throw new FuException("出現0",b);//手動通過throw 關鍵字拋出一個自定義的異常
        }
        return a/b;
    }
}
*/    
    
}



class Demo_3{
    int div(int a,int b) throws FuException
    {
        if(b <0){
            //System.out.println("出現異常:");
            throw new FuException("出現負數",b);//手動通過throw 關鍵字拋出一個自定義的異常
        }
        return a/b;
    }
}

public class D_Exception {
    public static void main(String[] args){
        Demo_3 d=new Demo_3();
        try{
            int x=d.div(4,2);
            System.out.println("x="+x);
        }
        catch(FuException e){
            //System.out.println(e.toString());
            //System.out.println("出現負數");
            System.out.println("負數:"+e.getValue());
        }
        //catch(Exception e){
            
        //}
        System.out.println("over");
        
    }

}

/*
class Person_1{
     public void checkName(String name){
         //if(name.equals("lisi")){//一旦[a]處傳入NULL,那麼就回報NullPointerException異常
                                    程序就停掉了。如何修正:
         if("lisi".equalse(name)){//if(name!==null&&name.equals("lisi")){
                                    
             System.out.println("YES");
         }else {
             System.out.println("NO");
         }
     }
}
main(){
    Person_1 p=new Person_1();
    p.checkName(null);//[a]
}
*/

------------------------------------------------------------------------------------------------------------------------------


【【異常應用】】
package _9Day;
/*
 * 異常應用
 *
 * 畢老師用電腦上課。
 * 老師、電腦、倆類,上課是行爲.
 *
 * 上課中會出現各種問題,產生異常。
 * 比如電腦、藍屏、冒煙兒    :接下來進行描述,封裝成對象            (自定義異常
 * 藍屏後只許重啓即可
 * 而  當冒煙發生後,會出現進度無法繼續。
 *         就出現了講師的問題,課時計劃無法完成。     (又多了個類
 *
 * 【通過state來手動設置異常】
 */

//藍屏異常
class LPException extends Exception{
//藍屏是可以處理的,大多時候重啓即可,那麼這裏就需要電腦的重啓功能了
    private Comeputer comp;
    LPException(String message){
        super(message);
    }
    public void goReset(){
        comp.reset();
    }
}
//冒煙異常
class MYException extends Exception{ //RuntimeException{//冒煙了無法處理了
    MYException(String message){
        super(message);
    }    
}

//人爲異常
class NoPlanException extends Exception{
    NoPlanException(String message){
        super(message);
    }
}

class Comeputer {
    //
    private int state =3;//2表示藍屏 3冒煙
    public void run()throws LPException,MYException{//拋出可能有的異常
        if(state==2){
            throw new LPException("電腦藍屏了。");//拋出異常
        }
        if(state==3){
            throw new MYException("電腦冒煙兒了");//拋出異常
        }
        System.out.println("comepter run");
    }
    public void reset(){
        state=1;
        System.out.println("comepter  reset");
    }
}

//
class Teacher{
    private String name;
    private Comeputer cmpt;
    
    Teacher(String name){//初始化老師名字、電腦
        this.name=name;
        cmpt=new Comeputer();
    }
    
    public void prelect()throws NoPlanException{//MYException{//講課方法        
        try{
            cmpt.run();
        }
        catch(LPException e){
            cmpt.reset();
        }
        catch(MYException e){//接收到冒煙異常然後拋出冒煙後無法繼續講課的問題,這個問題就好處理            
            test();
            throw new NoPlanException("課時無法繼續"+e.getMessage());
            //這裏的邏輯是,冒煙是不可處理異常,發生該異常後,處理就是換電腦,換老師等延續課時的方案。
            //test();  throw 後面是不能更語句的。他和return一樣是結束語句。
            
        }
        //System.out.println("開始講課");
    }
    
    public void test(){
        System.out.println("大家做練習吧");
    }
    
}



public class D_Exp_Test1 {

    public static void main(String[] args) {
        Teacher t=new Teacher("畢老師");

        try{
            t.prelect();
        }
        catch(NoPlanException e){
            System.out.println(e.toString());
            System.out.println("換老師,換電腦,放假");
        }

    }

}

---------------




---------- android培訓、 java培訓、期待與您交流!----------
黑馬官網: http://edu.csdn.net/heima
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章