2010-03-18 104 views
1

假設我有以下代碼:合同VS例外

public class MainClass { 
    public static void main(String[] args) { 
     System.out.println(sumNumbers(10, 10)); 
    } 

    //@requires a >= 10; 
    //@ensures \result < 0; 
    public static int sumNumbers(int a, int b) { 
     return a+b; 
    } 
} 

我可以在這裏做兩件事情:

使用代碼合同(在這種情況下,什麼是評論)。當sumNumbers運行和< 10,它會立刻拋出一個異常(儘管它似乎並不十分描述):

Exception in thread "main" org.jmlspecs.jmlrac.runtime.JMLInternalNormalPostconditionError: by method MainClass.sumNumbers 
    at MainClass.sumNumbers(MainClass.java:500) 
    at MainClass.internal$main(MainClass.java:9) 
    at MainClass.main(MainClass.java:286) 

或...

拋出一個異常。例外情況可以像我想要的那樣具有描述性。我還要檢查函數的結尾,以便在帖子條件爲真時查看。

你會在這裏使用哪個,爲什麼?

回答

2

我喜歡代碼合同的想法,但描述性IllegalArgumentException(或類似)提示它爲我。在支持/生產角色(甚至是開發人員)中,獲得明確的異常消息會更加清晰,從而使您能夠在診斷問題方面領先一步(系統是否損壞,或者如果在開發過程中濫用API )。

+0

最好的主意:同時使用! – 2010-03-18 20:58:42

+0

如果可以的話,是的。我不熟悉上面提供的'代碼合同' – 2010-03-18 20:59:51

+0

使用兩者都沒有意義。擁有一個聲明x> = 0的代碼合同的想法是我不必在方法體中再次檢查它。所以使用兩者都沒有意義。 – 2010-03-18 22:09:31

1

您是否期望在程序正常運行期間無效輸入可能會傳遞給此參數?如果是的話,你能從中恢復嗎?

如果是這樣,檢查異常是要走的路。

如果你無法從這種情況下恢復,那麼通過一切手段使它成爲一個合同,並大聲失敗 - 但在任何情況下,我會使用一個描述性的錯誤信息。