2013-04-01 33 views
5

對於我來說,這些代碼使用關鍵字拋出來聲明運行時異常

static int faktorial (int n) throws ArithmeticException { 
    if ((n < 0) || (n > 31)) { 
    throw new ArithmeticException(); 
    } 
    if (n > 1) { 
    return n * faktorial(n - 1); 
    } 
    else { 
    return 1; 
    }  
} 

和相同的代碼投擲無

throws ArithmeticException 

做同樣的,當我用下面的代碼使用它:

public static void main(String[] args) { 
    try { 
    int n; 
    Scanner sc = new Scanner(System.in); 

    System.out.print("Insert integer number: ");   
    n = sc.nextInt();   
    System.out.println(n + "! = " + faktorial(n)); 
    } 
    catch (InputMismatchException e) { 
    System.out.println("Not an integer number!"); 
    e. printStackTrace(); 
    } 
    catch (RuntimeException e) { 
    System.out.println("Number is too big!"); 
    e. printStackTrace(); 
    } 
} 

可能有人形容我,如果使用的

throws ArithmeticException 

在我的代碼中有一些優點。

我也會喜歡使用關鍵字throws的一個很好的例子。非常感謝你!

回答

9

由於ArithmeticExceptionunchecked exception,所以將其列在throws規範中對於編譯器而言沒有任何影響。

儘管如此,我認爲最好保持throws規範的文檔目的。

這就是說,ArithmeticException可能不是正確的例外,當用無效參數調用函數時拋出。使用IllegalArgumentException會更合適。

+0

它有它的上升空間,所以你不能只說這是多餘的 – dantuch

+0

非常感謝您! – mcihak

+1

@Keppil它不會**逼你抓住它。 – dantuch

3

上述方法簽名使用的表達throws ArithmeticException告訴 此功能的用戶該方法可能拋出此異常,他們應該是 認識和抓住它(如果他們想 - 「希望」僅僅是因爲這個異常是未經檢查 - 並計劃在這種情況下的解決方法)。

除了ArithmeticException不是在這種情況下使用的正確例外(您可以在技術上使用其中任何一個)。拋出一個更好的例外是IllegalArgumentException,因爲它意味着通過的論點是不正確的。

+0

謝謝你的建議! – mcihak

0

由於Java沒有提供簡單的True/False標誌來確定給定的異常是否爲checked or unchecked,所以您需要了解您(作爲程序員)必須處理的異常類型(捕獲或重新拋出),你可以選擇不處理(有效忽略)。

特別是,整個RunTimeException類未被選中,ArithmeticException是其子類。

3

除了說什麼,有一個好處,我發現幫助我的代碼。

Eclipse可以使用該信息(該方法聲明爲throws RuntimeException)和(按需)添加正確的 catch子句。

讓我們看看這個:

public static void main(String[] args) { 
    test(); 
} 

private static void test() { 
    foo(); 
    bar(); 
    baz(); 
} 

public static void foo() { 

} 

public static void bar() throws NullPointerException { 

} 

public static void baz() throws IllegalArgumentException { 

} 

加入try/ catch block內部方法test將導致:

private static void test() { 
    try { 
     foo(); 
     bar(); 
     baz(); 
    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

這很好,不是嗎?然而,它僅適用於第1級的方法調用,所以它不與運行時異常的多個漁獲污染更高級別的抽象:

public static void main(String[] args) { 
    try { 
     test(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private static void test() { 
    foo(); 
    bar(); 
    baz(); 
} 

這是很好的爲好。

不管怎樣,看到在Javadoc拋出可能是更重要的:)

void Test.baz() throws IllegalArgumentException 
相關問題