2014-02-25 50 views
1

上下文:我爲學校寫了一個信號類,其中一個要求是它不能用負值初始化。驗證提供給構造函數的值的最佳實踐?

現在我的構造函數拋出異常:

/** 
* Constructor 
*/ 
public Semaphore(int value) throws Exception 
{ 
    if (value < 0) 
     throw new Exception("Negative value provided for initial constructor."); 
    this.value = value; 
} 

處理,以實例化一個信號異常似乎過於沉重的我,所以我正在考慮悄然任何負值設置爲零,即:

/** 
* Constructor 
*/ 
public Semaphore(int value) 
{ 
    if (value < 0) 
     this.value = 0; 
    else 
     this.value = value; 
} 
+1

這裏沒有單一的最佳答案;它完全取決於包裝及其用戶的需求。 – keshlam

+0

在閱讀本文後發現http://stackoverflow.com/q/6086334/2671237 - 現在使用IllegalArgumentException(未經檢查的異常) – sfyn

+0

這正是我在下面提出的;) –

回答

7

您應該改用IllegalArgumentException。它不需要明確的異常處理,它的行爲與你想要的完全一樣,也就是表示一個非法的參數。

1

我建議拋出IllegalArgumentException

拋出,表明一個方法已通過非法或不適當的 爭論。

如果你的項目使用Guava,你可以使用Preconditions

public Semaphore(int value) throws Exception 
{ 
    Preconditions.checkArgument(value < 0, 
     "Negative value provided for initial constructor."); 

    this.value = value; 
} 

如果條件計算爲false,那麼IllegalArgumentException將被拋出。

在我看來,這種方式的代碼可以更具可讀性。

1

如果您說:嘿,值直接來自用戶糾正他們與消息。

如果你說:嘿,價值產生和一個錯誤產生負值

throw new IllegalArgumentException("Negative Value", 
    new IndexOutOfBoundsException(value+"")); 

如果你說:嘿,我喜歡讓VM決定拋出還是正確的。使用assert value > 0;

-1

一般來說,如果你有一個有1000個類的項目,每個類有20個功能,那就是20000個功能。檢查輸入參數併爲20000個函數中的許多函數拋出異常將會使您的代碼充滿驗證檢查。我更喜歡將javadoc添加到函數中,說您的函數的輸入參數不能爲負數(以及函數的用途)。這樣,你的函數的用戶(程序員)不必檢查你的函數的內容,以確定如何使用它,什麼是無效的。另外,他使用函數提供信息時,他的IDE的intellisense會彈出javadoc消息。如果他違反了javadoc,考慮讓它調用的函數或其中一個函數向調用堆棧拋出一個異常而不明確這樣做,或者讓函數不按預期工作而不拋出異常。如果您認爲提供無效輸入會產生一些不容易追查的奇怪行爲,您可能會考慮明確提出異常。 javadoc將幫助他追蹤問題,而不必專門拋出異常。一旦完成了業務邏輯的調試,除非業務邏輯中存在錯誤,否則拋出的異常不應該經常發生。

我不認爲異常應該是驗證用戶輸入的一部分。您的用戶輸入應該在到達業務邏輯之前進行全面驗證,而不是在達到業務邏輯功能時進行驗證。關於驗證上傳的xml文檔的相同論點。在將它傳遞給業務邏輯之前,根據xml模式檢查它。您的驗證邏輯應該基於true/false(驗證通過),而不是針對無效輸入引發異常。