當前位置:才華齋>計算機>java語言>

Java程式設計中throw和throws子句的使用方法

java語言 閱讀(2.55W)

Java throw:異常的丟擲

Java程式設計中throw和throws子句的使用方法

程式可以用throw語句丟擲明確的異常。Throw語句的通常形式如下:

throw ThrowableInstance;

這裡,ThrowableInstance一定是Throwable類型別或Throwable子類型別的一個物件。簡單型別,例如int或char,以及非Throwable類,例如String或Object,不能用作異常。有兩種可以獲得Throwable物件的方法:在catch子句中使用引數或者用new操作符建立。

程式執行在throw語句之後立即停止;後面的任何語句不被執行。最緊緊包圍的try塊用來檢查它是否含有一個與異常型別匹配的catch語句。如果發現了匹配的塊,控制轉向該語句;如果沒有發現,次包圍的try塊來檢查,以此類推。如果沒有發現匹配的catch塊,預設異常處理程式中斷程式的執行並且列印堆疊軌跡。

下面是一個建立並丟擲異常的`例子程式,與異常匹配的處理程式再把它丟擲給外層的處理程式。

// Demonstrate s ThrowDemo { static void demoproc() { try { throw new NullPointerException("demo"); } catch(NullPointerException e) { tln("Caught inside demoproc."); throw e; // rethrow the exception } } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e) { tln("Recaught: " + e); } }}

該程式有兩個機會處理相同的錯誤。首先,main()設立了一個異常關係然後呼叫demoproc( )。 demoproc( )方法然後設立了另一個異常處理關係並且立即丟擲一個新的NullPointerException例項,NullPointerException在下一行被捕獲。異常於是被再次丟擲。下面是輸出結果:

Caught inside ught: PointerException: demo

該程式還闡述了怎樣建立Java的標準異常物件,特別注意下面這一行:

throw new NullPointerException("demo");

這裡,new用來構造一個NullPointerException例項。所有的Java內建的執行時異常有兩個建構函式:一個沒有引數,一個帶有一個字串引數。當用到第二種形式時,引數指定描述異常的字串。如果物件用作 print( )或println( )的引數時,該字串被顯示。這同樣可以通過呼叫getMessage( )來實現,getMessage( )是由Throwable定義的。

Java throws子句

如果一個方法可以導致一個異常但不處理它,它必須指定這種行為以使方法的呼叫者可以保護它們自己而不發生異常。做到這點你可以在方法宣告中包含一個throws子句。一個 throws 子句列舉了一個方法可能丟擲的所有異常型別。這對於除Error或RuntimeException及它們子類以外型別的所有異常是必要的。一個方法可以丟擲的所有其他型別的異常必須在throws子句中宣告。如果不這樣做,將會導致編譯錯誤。

下面是包含一個throws子句的方法宣告的通用形式:

type method-name(parameter-list) throws exception-list{ // body of method}

這裡,exception-list是該方法可以丟擲的以有逗號分割的異常列表

下面是一個不正確的例子。該例試圖丟擲一個它不能捕獲的異常。因為程式沒有指定一個throws子句來宣告這一事實,程式將不會編譯。

// This program contains an error and will not s ThrowsDemo { static void throwOne() { tln("Inside throwOne."); throw new IllegalAccessException("demo"); } public static void main(String args[]) { throwOne(); }}

為編譯該程式,需要改變兩個地方。第一,需要宣告throwOne( )引發IllegalAccess Exception異常。第二,main( )必須定義一個try/catch 語句來捕獲該異常。正確的例子如下:

// This is now s ThrowsDemo { static void throwOne() throws IllegalAccessException { tln("Inside throwOne."); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { throwOne(); } catch (IllegalAccessException e) { tln("Caught " + e); } }}

下面是例題的輸出結果:

inside throwOnecaught galAccessException: demo