與 throws 不同的是,throw 關鍵字用來直接拋出一個異常,后面跟的是可拋出的異常類對象,其語法格式如下:
throw ExceptionObject;
ExceptionObject 必須是 Throwable 類或其子類的對象。如果是自定義異常類,也必須是 Throwable 的直接或間接子類。例如,以下語句在編譯時將會產生語法錯誤:
throw new String("拋出異常"); // String類不是Throwable類的子類
當 throw 語句執行時,它后面的語句將不執行,此時程序轉向調用者程序,尋找與之相匹配的 catch 語句,執行相應的異常處理程序。如果沒有找到相匹配的 catch 語句,則再轉向上一層的調用程序。這樣逐層向上,直到最外層的異常處理程序終止程序并打印出調用棧情況。
throw 關鍵字不會單獨使用,它的使用完全符合異常的處理機制,但是,一般來講用戶都在避免異常的產生,所以不會手工拋出一個新的異常類的實例,而往往會拋出程序中已經產生的異常類的實例。
在某倉庫管理系統中,要求管理員的用戶名需要由 8 位以上的字母或者數字組成,不能含有其他的字符。當長度在 8 位以下時拋出異常,并顯示異常信息;當字符含有非字母或者數字時,同樣拋出異常,顯示異常信息。
請看下面的代碼:
如上述代碼,在 validateUserName() 方法中兩處拋出了 IllegalArgumentException 異常,即當用戶名字符含有非字母或者數字以及長度不夠 8 位時。在 main() 方法中,調用了 validateUserName() 方法,并使用 catch 語句捕獲該方法可能拋出的異常。
運行程序,當用戶輸入的用戶名包含非字母或者數字的字符時,程序輸出異常信息,如下所示。
當用戶輸入的用戶名長度不夠 8 位時,程序同樣會輸出異常信息,如下所示。
throws 和 throw 關鍵字在使用過程中有以下幾個方面的區別:
1) throws 用來聲明一個方法可能拋出的所有異常信息,表示出現異常的一種可能性,但并不一定會發生這些異常;throw 則是指拋出的一個具體的異常類型,執行 throw 則一定拋出了某種異常對象。
2) 通常在一個方法(類)的聲明處通過 throws 聲明方法(類)可能拋出的異常信息,而在方法(類)內部通過 throw 聲明一個具體的異常信息。
3) throws 通常不用顯式地捕獲異常,可由系統自動將所有捕獲的異常信息拋給上級方法; throw 則需要用戶自己捕獲相關的異常,而后再對其進行相關包裝,最后將包裝后的異常信息拋出。