教妹學 Java :Throw 和 Throws
“二哥,你能告訴我 throw 和 throws 兩個關鍵字的區(qū)別嗎?”三妹問。
“throw 關鍵字,用于主動地拋出異常;正常情況下,當除數(shù)為 0 的時候,程序會主動拋出 ArithmeticException;但如果我們想要除數(shù)為 1 的時候也拋出 ArithmeticException,就可以使用 throw 關鍵字主動地拋出異常。”我說。
- throw new exception_class("error message");
語法也非常簡單,throw 關鍵字后跟上 new 關鍵字,以及異常的類型還有參數(shù)即可。
舉個例子。
- public class ThrowDemo {
- static void checkEligibilty(int stuage){
- if(stuage<18) {
- throw new ArithmeticException("年紀未滿 18 歲,禁止觀影");
- } else {
- System.out.println("請認真觀影!!");
- }
- }
- public static void main(String args[]){
- checkEligibilty(10);
- System.out.println("愉快地周末..");
- }
- }
這段代碼在運行的時候就會拋出以下錯誤:
- Exception in thread "main" java.lang.ArithmeticException: 年紀未滿 18 歲,禁止觀影
- at com.itwanger.s43.ThrowDemo.checkEligibilty(ThrowDemo.java:9)
- at com.itwanger.s43.ThrowDemo.main(ThrowDemo.java:16)
“throws 關鍵字的作用就和 throw 完全不同。”我說,“異常處理機制這小節(jié)中講了 checked exception 和 unchecked exception,也就是檢查型異常和非檢查型異常;對于檢查型異常來說,如果你沒有做處理,編譯器就會提示你。”
Class.forName() 方法在執(zhí)行的時候可能會遇到 java.lang.ClassNotFoundException 異常,一個檢查型異常,如果沒有做處理,IDEA 就會提示你,要么在方法簽名上聲明,要么放在 try-catch 中。
“那什么情況下使用 throws 而不是 try-catch 呢?”三妹問。
“假設現(xiàn)在有這么一個方法 myMethod(),可能會出現(xiàn) ArithmeticException 異常,也可能會出現(xiàn) NullPointerException。這種情況下,可以使用 try-catch 來處理。”我回答。
- public void myMethod() {
- try {
- // 可能拋出異常
- } catch (ArithmeticException e) {
- // 算術(shù)異常
- } catch (NullPointerException e) {
- // 空指針異常
- }
- }
“但假設有好幾個類似 myMethod() 的方法,如果為每個方法都加上 try-catch,就會顯得非常繁瑣。代碼就會變得又臭又長,可讀性就差了。”我繼續(xù)說。
“一個解決辦法就是,使用 throws 關鍵字,在方法簽名上聲明可能會拋出的異常,然后在調(diào)用該方法的地方使用 try-catch 進行處理。”
- public static void main(String args[]){
- try {
- myMethod1();
- } catch (ArithmeticException e) {
- // 算術(shù)異常
- } catch (NullPointerException e) {
- // 空指針異常
- }
- }
- public static void myMethod1() throws ArithmeticException, NullPointerException{
- // 方法簽名上聲明異常
- }
“好了,我來總結(jié)下 throw 和 throws 的區(qū)別,三妹,你記一下。”
1)throws 關鍵字用于聲明異常,它的作用和 try-catch 相似;而 throw 關鍵字用于顯式的拋出異常。
2)throws 關鍵字后面跟的是異常的名字;而 throw 關鍵字后面跟的是異常的對象。
示例。
- throws ArithmeticException;
- throw new ArithmeticException("算術(shù)異常");
3)throws 關鍵字出現(xiàn)在方法簽名上,而 throw 關鍵字出現(xiàn)在方法體里。
4)throws 關鍵字在聲明異常的時候可以跟多個,用逗號隔開;而 throw 關鍵字每次只能拋出一個異常。
“三妹,這下子清楚了吧?”我抬抬頭,看了看三妹說。
“好的,二哥,這下徹底記住了,你真棒!”
本文轉(zhuǎn)載自微信公眾號「沉默王二」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系沉默王二公眾號。