java中的異常

菜雞03號發表於2016-10-26
1Java程式在執行過程中如出現異常,會自動生成一個異常類物件,該異常物件將被提交給Java執行時系統,這個過程稱為丟擲(throw)異常。
 
2)當Java執行時系統接收到異常物件時,會尋找能處理這一異常的程式碼並把當前異常物件交給其處理,這一過程稱為捕獲(catch)異常。
 
3)如果Java執行時系統找不到可以捕獲異常的方法,則執行時系統將終止,相應的Java程式也將退出。
 
4)對於RuntimeException,通常不需要我們去捕獲,這類異常由Java執行系統自動丟擲並自動處理。
 
5)派生類構造方法的異常說明必須包含基類構造方法的異常說明,即派生類構造方法的異常必須為基類異常或其父類,當基類構造方法沒有異常時,派生類構造方法也可以異常宣告。注意,派生類構造器不能捕獲基類構造方法丟擲的異常。
 
6)派生類方法可以不丟擲異常,即使基類有異常說明,如果派生類方法有異常說明,必須是基類異常或其子類,而且當基類沒有異常宣告時,派生類方法不允許異常宣告(關於構造方法見5中的說明)。
 
7)我們可以在方法宣告時,宣告一個不會丟擲的異常,Java編譯器就會強迫方法的使用者對異常進行處理。這種方式通常應用於abstract classinterface中。
 
顯示異常
catch(Exception e) {
       System.out.println(e.getMessage());  //獲取異常資訊
    System.out.println(e.toString);  //返回簡短的描述資訊
    e.printStackTrace();  //發生異常的位置
       }
 
丟擲異常throw
當丟擲異常後。首先,同Java中其他物件的建立一樣,將使用new在堆上建立異常物件。然後,當前的執行路徑被終止,並且從當前環境中彈出對異常物件的引用。此時,異常處理機制接管程式,並開始尋找一個恰當的地方來繼續執行程式。這個恰當的地方就是“異常處理程式”,它的任務是將程式從錯誤狀態中恢復,以使程式能換一種方式執行,或者繼續執行下去。
舉一個丟擲異常的簡單例子。對於物件引用t,傳給你的時候可能尚未被初始化。所以在使用這個物件引用呼叫其方法之前,會先對引用進行檢查。可以建立一個代表錯誤資訊的物件,並且將它從當前環境中“丟擲”,這樣就把錯誤資訊傳播到了“更大”的環境中。這被稱為“丟擲一個異常”。
if(t==null)
  throw new NullPointerException();
 
異常引數
所有標準異常類都有兩個構造器:一個是預設構造器;另一個是接受字串作為引數,以便能把相關資訊放入異常物件的構造器:
throw new NullPointerException(“t=null”);
 
捕獲異常try-catch
如果在方法內部丟擲了異常(或者在方法內部呼叫的其他方法丟擲了異常),這個方法將在丟擲異常的過程中結束。要是不希望就此結束,可以在方法內設定一個特殊的塊來捕獲異常。這個塊就是try塊。
try{
  //Code that might generate exceptions
}
丟擲的異常必須在某處得到處理,以catch子句的形式處理。
 
異常說明throws
“異常說明”告知了客戶端某個方法可能會丟擲的異常型別。它屬於方法宣告的一部分,緊跟在形式引數列表之後。
void f() throws Exception1,Exception2{...}
程式碼必須與異常說明保持一致。如果方法裡的程式碼產生了異常卻沒有進行處理,編譯器會發現這個問題並提醒你:要麼處理這個異常,要麼就在異常說明中表明此方法將產生異常。
使用eclipse時,會有相應的提示:
1Add throws declaration
2Surround with try/catch
所以可以這麼理解異常說明,一個方法碰到一個自己無法處理的錯誤時,需要在方法頭宣告它可能會丟擲的異常("已檢查異常")。以下四種情況會丟擲異常:
-呼叫了一個會丟擲"已檢查異常"的方法。
-程式執行過程中發生了錯誤,並且用throw語句丟擲一個"已檢查異常"
-程式錯誤。
-Java虛擬機器或者執行時庫出現了內部錯誤。
前兩種情況需要在方法中使用throws語句宣告,以告訴呼叫該方法的程式設計師,可能碰到的"已檢查異常"(即,一個方法必須宣告它可能丟擲的全部"已檢查異常")。通過捕獲異常,就可以使方法不會將異常丟擲,從而不需要使用throws字句。通常,應捕獲並且處理那些已知如何處理的異常,而傳遞那些不知如何處理的異常。
 
重新丟擲異常throw
有時希望把剛捕獲的異常重新丟擲。
catch(Exception e){
  System.err.println(“An Exception was thrown”);
  throw e;
}
重新丟擲異常會把異常拋給上一級環境中的異常處理程式,同一個try塊的後續catch子句將被忽略。
 
Java標準異常
Throwable這個Java類被用來表示任何可以作為異常被丟擲的類。Throwable物件可分為兩種型別(指從Throwable繼承而得到的型別):Error用來表示編譯時和系統錯誤;Exception是可以被丟擲的基本型別、在Java類庫、使用者方法以及執行時故障都可能丟擲Exception異常。
Java異常類的結構:
  Throwable
   |____Error
   |____Exception
         |____RuntimeException
         |____其它Exception
  Error:Java執行系統中的內部錯誤以及資源耗盡的情況。
  Exception:RuntimeException及其子類(程式設計導致的異常)、其它Exception類。
 
關於RuntimeException
RuntimeException(或任何從它繼承的異常),對於這種異常型別,編譯器不需要異常說明。注意,只能在程式碼中忽略RuntimeException(及其子類)型別的異常,其他型別異常的處理都是由編譯器強制實施的。
 
關於finally
對於一些程式碼,可能會希望無論try塊中的異常是否丟擲,它們都能得到執行。為了達到這一效果,可以在異常處理程式後面加上finally子句。
示例1
方法{
  try{
  ……..
  return;//加此條語句
  }
  catch(Exception e){
  }
  finally{
  ……….//會執行
  }
  ……….//不會執行
 
}
示例2
方法{
  try{
  ……..
  System.exit(-1);//終止執行
  }
  catch(Exception e){
  }
  finally{
  ……….//不會執行
  }
  ……….//不會執行
 
}
 

相關文章