java===Exception異常處理

package cn.china;
/**
 * 異常:在運行時期發生的不正常狀況。
 * 問題不少,意味着描述的類也不少,
 * 將其共性進行向上抽取,造成異常體系。
 * 最終問題就分紅兩大類:
 * throwable:不管是Error,仍是異常,都是問題,就應該能夠拋出,讓調用者知道並處理。
 * 該體系的特色就在於throwable及其全部子類都具備可拋性。
 * 如何體現可拋性?
 * 實際上是經過兩個關鍵字體現的,throws,throw;凡是能夠被這兩個關鍵字操做的類和對象都具備可拋性。
 *    一、通常不可處理的,Error
 *    特色:是由JVM拋出的嚴重性問題,已經影響到咱們程序的執行;這種問題發生通常不針對性處理,直接修改程序
 *    二、能夠處理的,Exception
 *     特色:子類的後綴名都是用其父類名做爲後綴,閱讀性很強。
 *     
 *     異常分類:
 *     一、編譯時被檢測異常:只要是Exception和其子類都是,除了RunTimeException和其子類
 *     這種問題一旦出現,但願在編譯時就進行檢測,讓這種問題有對應的處理方式。
 *     這樣的問題均可以針對性的處理
 *     二、編譯時不檢測異常(運行時異常):RunTimeException和其子類。
 *     這樣的問題的發生,沒法讓功能繼續,運算沒法進行,更可能是由於調用的緣由致使的或者引起了內部狀態的改變致使的。
 *     這種問題通常不處理,直接編譯經過,在運行時,讓調用者調用時的程序強制中止,讓調用者對代碼進行調整。
 *     
 *     throw 和 throws區別?
 *     throws 使用在函數上  拋出的是異常類,能夠拋出多個能夠用逗號隔開
 *     throw 使用在函數內   拋出的是異常對象*/
class FuShuIndexException extends Exception//因此這裏能夠繼承RunTimeException,就不須要聲明或者捕捉異常,編譯不會失敗
{
    public FuShuIndexException(String meg) {
        super(meg);
        // TODO Auto-generated constructor stub
    }
}
class D{
    public int method(int arr[],int index)throws FuShuIndexException
    {
        if(arr==null)
            throw new NullPointerException("數組的引用不能爲空!");
        if(index>=arr.length)
            throw new ArrayIndexOutOfBoundsException("數組越界了!"+index);
        if(index<0)//準備用負數角標異常來表示,可是這種異常在java中並無定義過。按照java異常的建立思想,將負數角標進行自定義描述,並封裝成對象
            throw new FuShuIndexException("數組的角標不能爲負數"+index);
        return arr[index];
    }
}
public class Demo {

    public static void main(String[] args) throws FuShuIndexException
    {
        int[]arr=new int[3];
        D d=new D();
        int num= d.method(arr, -30);
       
    }
    

}
package cn.china;
/**異常處理的捕捉形式
 * 具體格式:
 * try
 * {須要被檢測異常的代碼}
 * catch(異常類  變量)  //該變量用於接收發生異常的對象
 * {處理異常的代碼}
 * finally
 * {必定會被執行的代碼}
 * 
 * 
 * 異常處理原則:
 * 一、函數內部若是拋出須要檢測的異常,那麼函數上必需要聲明,不然必須在函數內必需要用trycatch捕捉,不然編譯失敗。
 * 二、若是調用到了聲明異常的函數,要麼trycatch要麼throws,不然編譯失敗。
 * 三、何時catch,何時throws呢?
 * 功能內部能夠解決,用catch;
 * 解決不了用throws,告訴調用者,調用者解決;
 * 四、一個功能若是拋出多個異常,那麼調用時必須由對應多個catch進行鍼對性處理。
 * 內部有幾個要檢測的異常,就拋幾個異常,拋出幾個,就catch幾個;*/
class FuShuIndexException extends Exception//因此這裏能夠繼承RunTimeException,就不須要聲明或者捕捉異常,編譯不會失敗
{
    public FuShuIndexException(String meg) {
        super(meg);
    }
}
class C{
    public int method(int arr[],int index)throws FuShuIndexException
    {
        if(arr==null)
            throw new NullPointerException("數組的引用不能爲空!");
        if(index>=arr.length)
            throw new ArrayIndexOutOfBoundsException("數組越界了!"+index);
        if(index<0)//準備用負數角標異常來表示,可是這種異常在java中並無定義過。按照java異常的建立思想,將負數角標進行自定義描述,並封裝成對象
            throw new FuShuIndexException("數組的角標不能爲負數"+index);
        return arr[index];
    }
}
public class Demo1 {

    public static void main(String[] args) {
        int[]arr=new int[3];
        C c=new C();
        try
        {
        int num= c.method(arr, -30);
        System.out.println("num"+num);//num是局部變量 因此這兩句話要放在同一個代碼塊
        }
        catch(NullPointerException e){//多catch格式
            e.printStackTrace();
        }
        catch(ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }
        catch(FuShuIndexException e)
        {
            e.printStackTrace();//JVM默認的異常處理機制就是調用異常對象的這個方法。
            System.out.println("Message"+e.getMessage());
            System.out.println("String"+e.toString());
            System.out.println("負數角標異常!");
        }
        catch(Exception e){//父類須要放在最下面,否則編譯失敗,由於Exception跟全部異常都匹配,
            e.printStackTrace();
        }
        System.out.println("over!");

    }

}
package cn.china;
/**try  catch  finally 組合特色
 * 一、 try  catch  finally
 * 二、try  catch(多個當沒有必要資源須要釋放時,能夠不用定義finally)
 * 三、 try  finally
 * 例:void show()throws Exception //由於沒有catch因此必須聲明異常
 * {
 *  try{
 *  //開啓資源
 *  throw new Exception
 *  }
 *  finally{
 *  //關閉資源
 *  }
 * }*/
class E{
    public int method(int  index)
    {
        int[]arr=new int[3];
        if(index>=arr.length)
            throw new ArrayIndexOutOfBoundsException();
        return arr[index];
    }
}
public class Demo2 {

    public static void main(String[] args) {
        E e=new E();
        try{int num=e.method(3);
        System.out.println(num);
        }catch(ArrayIndexOutOfBoundsException c)
        {
            System.out.println(c.toString());
            return;
            //System.exit(0); 退出JVM只有這種狀況不會執行finally語句;
        }
        finally {//必定會被執行的語句,主要用於關閉或者釋放資源
            System.out.println("finally");
        }
        System.out.println("over!");

    }

}
package cn.china;

import java.time.format.TextStyle;

/**
 * 畢老師用電腦上課,
 * 分析其中問題:
 * 電腦藍屏,冒煙*/
class LanPingException extends Exception
{
    LanPingException(String msg){
        super(msg);
    }
}
class MaoYanException extends Exception
{
    MaoYanException(String msg){
        super(msg);
    }
}
class NoPlanException extends Exception{
    NoPlanException(String msg){
        super(msg);
    }
}
class Computer{
    private int state=0;
    public void run()throws LanPingException,MaoYanException
    {
        if(state==1)
          throw new LanPingException("藍屏啦");
        if(state==2)
            throw new MaoYanException("電腦冒煙了");
        System.out.println("電腦運行");
    }
    public void reset(){
        state=0;
        System.out.println("電腦重啓了");
    }
}
class Teacher{
    private String  name;
    private Computer comp;
    Teacher(String name){
        this.name=name;
        comp=new Computer();
    }
    public void prelect()throws NoPlanException
    {
        try
        {
            comp.run();
            System.out.println("講課");
        }catch(LanPingException e){
            System.out.println(e.toString());
            comp.reset();
            prelect();
        }catch(MaoYanException e){
            System.out.println(e.toString());
            test();
            throw new NoPlanException("課時沒法進行"+e.getMessage());
            //能夠對電腦進行維修
            //throw e;
        }
    }
    public void test(){
        System.out.println("你們練習");
    }
}
public class Demo3 {

    public static void main(String[] args) {
        Teacher teacher=new Teacher("畢老師");
        try
        {
            teacher.prelect();
        }
        catch(NoPlanException e)
        {
            System.out.println(e.toString()+"......");
            System.out.println("換人");
        }


    }

}
/**
 * class NoAddException extends Exception{}
 * void addData(Data d)throws NoAddException
 * {
 *    連接數據庫
 *    try{
 *    添加數據庫,出現異常 SQLException();
 *    }catch(SQLException e)
 *    {
 *        //處理代碼
 *        throw new NoAddException();
 *    }finally
 *    {
 *         
 *    關閉數據庫
 *    }
 * }*/
 
package cn.china;
/**異常的注意事項
 * 一、子類在覆蓋父類方法時若是父類的方法拋出異常,那麼子類的方法只能破案出父類的異常,或者該異常的子類
 * 二、若是父類拋出多個異常,那麼子類子還能拋出父類異常的子集
 * 
 * 簡單說:子類覆蓋父類,只能拋出父類的異常,或者子集;若是父類沒有拋出異常,那麼子類覆蓋時絕對不能拋出異常,可是能夠用try;*/
class A extends Exception 
{
}
class B extends A
{}
class C extends Exception
{}
class Fu{
    void show()throws A{}
}
class Zi extends Fu{
    void show()throws B{}//只能拋出A或者B 
}
class Test{
    void method(Fu f){
        try{
            f.show();
        }catch(A a){}
    }
}
public class Demo4 {

    public static void main(String[] args) {
        Test t=new Test();
        t.method(new Zi());

    }

}
相關文章
相關標籤/搜索