1. 程式人生 > >Java中內部類和異常處理

Java中內部類和異常處理

1、 內部類

內部類的訪問規則:
1) 內部類可以訪問外部類的成員包括私有。
之所以可以直接訪問外部類的成員,是因為內部類持有一個外部類的引用 , 格式: 外部類名.this

2) 外部類要訪問內部類,必須建立內部類物件。
當內部類處於外部類的成員位置且非私有,可以在其他外部類中建立內部類物件
格式: 外部類名.內部類名 變數名 = new 外部類名().new 內部類名(); //前提是該內部類在外部類中被宣告為public。
Outer.Inner inner = new Outer().new Inner(); //amazing! but you can try!


被static修飾的內部類具備static的特性
當內部類被static修飾後, 只能訪問外部類中靜態的成員,出現了訪問許可權
注意: 當內部類中定義了靜態的成員,該內部類必須是static修飾的。
當外部類中的靜態方法訪問內部類時,該內部類也必須是static修飾的。

3) 何時用內部類
當描述事物時,事物的內部還有事物,該事物就用內部類來描述。因為內部事務在使用外部事物的內容。

2 、匿名內部類

1)匿名內部類就是內部類的簡寫格式
2) 定義匿名內部類的前提: 內部類必須是繼承一個類或實現介面
3)匿名內部類的格式: new 父類或介面(){定義子類的內容};


4)其實匿名內部類就是一個匿名子類物件,理解為帶有內容的子類物件
5)匿名內部類中定義的方法最好不要超過三個

3 、異常

異常就是程式執行時出現的不正常情況
1)對於問題的劃分:
1.嚴重的問題,java通過Error類進行描述, 一般不編寫針對性程式碼進行處理。
2.非嚴重問題 java通過Exception類進行描述,一般編寫針對性程式碼進行處理。
無論Error或者Exception都具有一些共性內容。
比如:不正常情況的資訊,引發原因等。
Throwable
|–Error
|–Exception

2)異常的處理
Java 提供了特有的語句進行處理。

try
{
     // 需要被檢測的程式碼;
}
catch(異常類 變數)
{
     // 處理異常的程式碼;(處理方式)
}
finally
{
     // 一定會執行的語句;
}

3)對捕獲到的異常物件進行常見方法操作。
String getMessage():獲取異常資訊。
在函式上宣告異常,便於提高安全性,讓呼叫處進行處理,不處理編譯失敗。
對多異常的處理:
1. 宣告異常時,建議宣告更為具體的異常。這樣處理的可以更具體。
2. 對方宣告幾個異常,就對應有幾個catch塊。不要定義多餘的catch塊。
如果多個catch塊中的異常出現繼承關係,父類異常catch塊放在最下面。
建立在進行catch處理時,catch中一定要定義具體處理方式。
不要簡單定義一句 e.printStackTrace(),
也不要簡單的就書寫一條輸出語句。

4)自定義異常
自定義異常必須是異常類繼承Exception類。
繼承Exception類的原因: 因為異常類和異常物件都具有可拋性,這個可拋性是Throwable這個體系中的特點,只有這個體系中的類和物件才可以被throw或throws操作。

如何定義異常資訊?
因為父類中已經把異常資訊的操作完成了,所以子類在構造時,將異常資訊傳遞給父類通過super語句,就可以通過getMessage方法獲得異常資訊。

5)throw和throws的區別
throws使用在函式上,後面跟異常類,可以是多個,用逗號隔開。
throw使用在函式內, 後面跟異常物件。

6)RuntimeException
Exceptoin中有一個特殊的子類異常RuntimeException 執行時異常。
如果在函式內容丟擲該異常,函式上可以不用宣告,編譯一樣通過。
如果在函式上聲明瞭該異常。呼叫者可以不用進行處理。編譯一樣通過;
之所以不用在函式宣告,是因為不需要讓呼叫者處理。
當該異常發生,希望程式停止。因為在執行時,出現了無法繼續運算的情況,希望停止程式後,
對程式碼進行修正。

自定義異常時:
如果該異常的發生,無法在繼續進行運算,就讓自定義異常繼承RuntimeException。

對於異常分兩種:
1. 編譯時被檢測的異常。
2. 編譯時不被檢測的異常(執行時異常。RuntimeException以及其子類)

7) finally程式碼塊:定義一定執行的程式碼,通常用於關閉資源。

自定義異常:
定義類繼承Exception或者RuntimeException
1. 為了讓該自定義類具備可拋性。
2. 讓該類具備操作異常的共性方法。
當要定義自定義異常的資訊時,可以使用父類已經定義好的功能。
異常異常資訊傳遞給父類的建構函式。

 class MyException extends Exception
 {
  MyException(String message)
  {
   super(message);
  }
 }

自定義異常:按照java的面向物件思想,將程式中出現的特有問題進行封裝。

異常的處理原則:
1. 處理方式有兩種:try 或者 throws。
2. 呼叫到丟擲異常的功能時,丟擲幾個,就處理幾個。一個try對應多個catch。
3. 多個catch,父類的catch放到最下面。
4. catch內,需要定義針對性的處理方式。不要簡單的定義printStackTrace,輸出語句也不要不寫。當捕獲到的異常,本功能處理不了時,可以繼續在catch中丟擲。

try
  {
   throw new AException();
  }
  catch (AException e)
  {
   throw e;     //處理不了,則繼續丟擲
  }

如果該異常處理不了,但並不屬於該功能出現的異常,可以將異常轉換後,在丟擲和該功能相關的異常。
或者異常可以處理,當需要將異常產生的和本功能相關的問題提供出去,讓呼叫者知道並處理,也可以將捕獲異常處理後,轉換新的異常。

 try
  {
   throw new AException();
  }
  catch (AException e)
  {
   // 對AException處理。
   throw new BException();
  }

比如,匯款的例子。

異常的注意事項:
在子父類覆蓋時:
1. 子類丟擲的異常必須是父類的異常的子類或者子集。
2. 如果父類或者介面沒有異常丟擲時,子類覆蓋出現異常,只能try不能拋。