Java基礎知識(十)匿名內部類&異常基礎

匿名內部類是內部類的一種簡寫形式,不寫名字而已。
使用有個前提是:匿名內部類必須是繼承一個類或者實現接口。
格式: new 父類(){裏面重寫要寫的方法}.方法();

事實上,方法前面的一堆相當於是一個子類對象。

通常,匿名內部類中定義的方法最好不要超過3個。因爲匿名內部類就是爲了簡化代碼而已,它把1複寫父類2建立對象3調用方法 放在一起寫了。所以方法一定要少,一般不多於3個。

最常見使用內部類的情況是:需要傳一個方法少於三個的接口作爲參數時。舉例如下:

show(new Inner()
{
    public void balabala()
    {
        Sys("");
    }
});
*/


abstract class Abs
{
    abstract void method();
}

class Outer
{
    int x = 3;

    /*
    class Inner extends Abs
    {
        void method()
        {
            System.out.println("method:"+x);
        }

    }
    */
    public void fun()
    {
       // new Inner().method();
       new Abs()       //匿名內部類
       {
            void method()
            {
                 System.out.println("method:"+x);
            }
       }.method();
    }
}
class AbsDemo
{
    public static void main(String[] args)
    {
        new Outer().fun();
    }
}

還可以這樣寫:

 public void fun()
    {
       // new Inner().method();
       Abs in = new Abs()
       {
            void method()
            {
                 System.out.println("method:"+x);
            }
            void print()
            {
                System.out.println("i am a little tired ");
            }
       }
        in.method();
        in.print();   //前提是父類中也有這個方法。若沒有剛不能這樣調用。
    }

下面講的是異常。

異常:程序在運行時出現的不正常情況。
異常也是一種生活中存在的事物,也被描述成了類並封裝成對象。
其實就是把一些常見問題封裝成了對象,叫異常。
分成兩種,嚴重的一種封裝成Error類,不嚴重的封裝成Exception類
    對error一般不寫針對性代碼對其處理。
    對exception一般有針對性代碼對其處理。
 把error和exception向上抽取出共性的東西組成了異常的超類   throwable
  偷師:java中爲了提高可讀性把父類名字寫成子類名的後綴,這點很好,比如xxError一看就知道是Error類的子類。
格式:
try{
    要被檢測的代碼
}
catch(異常類 變量){ 處理方法}
finally{一定會執行的語句}

常用對捕獲的異常進行的操作:
1  getMessage()
2  printStackTrace()
3  toString()

throws Exception的含意:拋給虛擬機


對多異常的處理:
1、拋出異常時建議聲明爲更具體的異常,這樣方便處理。比如throws AtithmeticException,ArrayIndexOutOfBoundsException
但此時需要用兩個catch去處理。發生哪個異常哪個catch去處理,但只會有一個catch被執行。
2、如果聲明的幾個異常出現繼承關係,父類異常放最下面。
3、不要定義多餘的catch塊。
4、catch中要有具體的解決方法,或者形成異常日誌文件。

class Demo
{
    int div(int a,int b)throws Exception //在功能上通過關鍵字聲明出該功能可能會出現問題。
    {
        return a/b;
    }
}
class ExDemo
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        try
        {
            int x=d.div(4,0);
            System.out.println("x="+x);
        }
        catch(Exception e)
        {
            System.out.println("除零錯誤");
            System.out.println(e.getMessage());
            System.out.println(e.toString());  //異常信息:異常名稱
            e.printStackTrace();//異常名稱:異常信息,異常出現的位置。(JVM默認異常處理就是它。)
        }

        System.out.println("over");
    }

}

自定義異常:一些我們項目中特有的而java沒有封裝的異常。必須是繼承自Exception否則沒用。

繼承的原因:異常類和異常對象都需要被拋出因爲它們會導致跳轉,它們都具備可拋性,這個可拋性只有throwable類的獨有特點,
只有這個體系中的成員才能被throw和throws這兩個關鍵字操作。

throws 和 throw 區別:
1、throws 使用位置在函數上(小括號和大括號之間),throw在函數內
2、throws 後面跟的是異常類,可以跟多個,用逗號隔開。throw 後面跟異常對象。

需求:在本程序中除數不可以爲負數。

當函數內部已經出現異常,則必須有解決,常用方法有兩種:1在內部try catch處理  2在函數上聲明,讓調用者處理。


自定義的異常如何定義所屬信息?(重寫父類中的getMessage方法)
因爲父類中都寫完了,子類只需要在構造時將異常信息傳遞給父類,通過super語句,那麼就可以通過getMessage方法獲取自定義的異常信息了。


所有的函數內拋都必須在函數上聲明,一個真香特例是runtimeException可以不這樣做。
RunTimeException:    如果在函數內容出現異常,函數上可以不用聲明,編譯一樣通過。
                                    如果在函數上聲明異常,調用者可以不用處理,編譯一樣通過。

class FuShuException extends Exception  //定義異常類,注意起名時候後面有後綴(好習慣)
{
    /*
    private String msg;

    FuShuException(String msg)
    {
        this.msg = msg;
    }
    public String getMessage()
    {
        return msg;
    }*/

    private int key;

    FuShuException(String msg,int key)
    {
        super(msg);
        this.key = key;
    }
    public int getKey()
    {
        return key;
    }
}
class Demo
{
    int div(int a,int b )throws FuShuException
    {
        if(b<0)     //注意下面的throw沒有s
            throw new FuShuException("被除數小於零了呀!",b);  //手動通過建立對象拋出自定義異常。
        return a/b;
    }

}
class Test
{
    public static void main(String[] args)
    {
        Demo d = new Demo();

        try
        {   int x = d.div(4,-1);

            System.out.println("x="+x);
        }

        catch(FuShuException e)
        {
            System.out.println(e.toString());
            System.out.println("the wrong number is "+e.getKey());
        }
        System.out.println("over");
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章