2012-11-30 32 views
1

我正在編寫一個家庭作業的程序,我需要驗證用戶輸入,然後創建一個對象並將其添加到數組列表中。我已經包含了我認爲是相關的代碼,但我確實是一個初學者,所以讓我知道是否有其他東西需要看。Java:正確的方法來拋出並捕獲異常來驗證輸入

我讓用戶輸入一個字符串,然後檢查,看看它雙。如果它不是一個雙,我把我確保它是一個數字,我在其他類我檢查,以確保它是我想要的範圍後創建

 try{ 
     price = Double.parseDouble(strPrice); 
    } 
    catch(NumberFormatException nfe){ 
     CDException cde = new CDException(); 
     cde.setMessage("Price must be a number,\nCannot create CD"); 
     throw cde; 
    } 

異常。 (在這種情況下,非負),然後創建一個對象與價值

public void setPrice(double newPrice)throws Exception{ 
    if(newPrice >= 0){ 
     this.price = newPrice; 
    } 
    else{ 
     CDException cde = new CDException(); 
     cde.setMessage("CD Price cannot be negative,\nCannot create CD"); 
     throw cde; 
    } 
} 

所以我的問題是...

有沒有辦法一步到位做到這一點,同時檢查用戶輸入了數字並且該數字不是負數。另一件事是,如果輸入是空白的,那就是結束輸入循環的指令。

+2

你的代碼看起來不錯。我提供的唯一建議是將'message'參數傳遞給異常構造函數。 – erickson

+0

感謝您的意見和建議。我們正在使用老師爲我們提供的例外課 –

回答

2

好了,你可以改變代碼如下:

try { 
    price = Double.parseDouble(strPrice); 
    if (price < 0) { 
     throw new CDException("Can't be negative"); 
    } 
} catch (NumberFormatException ex) { 
    ... 
} 

但問題是你是否真的想這樣做。從設計角度來看,在setPrice內部進行「否定」檢查可能更有意義,而不是將其作爲解析邏輯的一部分。

2

在我看來,將它分成單獨的功能更好。您可以更好地分離問題,從而促進代碼重用。這是一個非常簡單的「混搭」不過,如果你堅持結合的功能(我不認爲你應該):

public void setPrice(String newPriceStr) throws CDException { 
    if(newPriceStr == null) throw new CDException("Null value given for price"); 

    double newPrice = -1; 

    try { 
     newPrice = Double.valueOf(newPriceStr); 
    } catch(final NumberFormatException nfe) { 
     throw new CDException("Price must be a number,\nCannot create CD"); 
    } 
    if(newPrice >= 0){ 
     this.price = newPrice; 
    } 
    else{ 
     throw new CDException("CD Price cannot be negative,\nCannot create CD"); 
    } 
} 

注意縮寫形式,用於創建和拋出異常。

2

我知道這是家庭作業,這個答案可能不是你的班老師所接受,但在「現實世界」我會用一個驗證框架,而不是推倒重來,例如內置的一個用Java EE 6:http://en.wikipedia.org/wiki/Bean_Validation

下面是一個教程使用它們:http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html

一些例子:

public class CD { 
    @NotNull 
    @Size(min=1, max=16) 
    private String CDName; 

    @Digits(integer=6, fraction=2) 
    BigDecimal price; 

} 

優點

  • DRY(不要重複自己,例如聲明驗證一次)
  • 讀(很明顯和記錄)

缺點

  • 的Java EE已超過複雜一些事情的傾向,但它仍然是一個有效的選擇
  • 不是每個人都喜歡使用註釋和喜歡看他們眼中的代碼的「魔術」

我確定有更多的優點/缺點,但這是超出了這個答案/問題的範圍。