匿名內部類是內部類的一種簡寫形式,不寫名字而已。
使用有個前提是:匿名內部類必須是繼承一個類或者實現接口。
格式: 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");
}
}