java中的異常
1)Java程式在執行過程中如出現異常,會自動生成一個異常類物件,該異常物件將被提交給Java執行時系統,這個過程稱為丟擲(throw)異常。
2)當Java執行時系統接收到異常物件時,會尋找能處理這一異常的程式碼並把當前異常物件交給其處理,這一過程稱為捕獲(catch)異常。
3)如果Java執行時系統找不到可以捕獲異常的方法,則執行時系統將終止,相應的Java程式也將退出。
4)對於RuntimeException,通常不需要我們去捕獲,這類異常由Java執行系統自動丟擲並自動處理。
5)派生類構造方法的異常說明必須包含基類構造方法的異常說明,即派生類構造方法的異常必須為基類異常或其父類,當基類構造方法沒有異常時,派生類構造方法也可以異常宣告。注意,派生類構造器不能捕獲基類構造方法丟擲的異常。
6)派生類方法可以不丟擲異常,即使基類有異常說明,如果派生類方法有異常說明,必須是基類異常或其子類,而且當基類沒有異常宣告時,派生類方法不允許異常宣告(關於構造方法見5中的說明)。
7)我們可以在方法宣告時,宣告一個不會丟擲的異常,Java編譯器就會強迫方法的使用者對異常進行處理。這種方式通常應用於abstract class和interface中。
顯示異常
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時,會有相應的提示:
1)Add throws declaration
2)Surround 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{
……….//不會執行
}
……….//不會執行
}
|
相關文章
- Java 中的異常Java
- 聊聊Java中的異常(基礎篇)Java
- Java 中的異常處理機制Java
- Java異常的中斷和恢復Java
- Java異常Java
- Java 異常Java
- 異常JavaJava
- 【java】異常Java
- java 異常Java
- Java中測試異常的多種方式Java
- Java 異常(二) 自定義異常Java
- Java checked異常和unchecked異常。Java
- java優雅的處理程式中的異常Java
- java之JAVA異常Java
- Java 異常處理中的種種細節!Java
- Java中的異常處理(隨堂筆記)Java筆記
- 揭曉Java異常體系中的祕密Java
- Java中如何避免空指標異常Java指標
- Java中異常處理和設計Java
- 對Java異常的理解Java
- Java中常見的異常Java
- java之異常Java
- jmu-Java-06異常-01-常見異常Java
- Java 異常表與異常處理原理Java
- ORACLE中的異常(轉)Oracle
- 翻譯 | Java流中如何處理異常Java
- Java中如何處理空指標異常Java指標
- Java中的Exception拋異常對效能的影響 - BaeldungJavaException
- Java異常體系的探究Java
- Java--異常的學習Java
- Java的自定義異常類Java
- Java 異常(一) 異常概述及其架構Java架構
- Java基礎-異常Java
- Java 筆記《異常》Java筆記
- Java基礎 — 異常Java
- java異常機制Java
- 如何善用Java異常Java
- Java 異常進階Java