1

我正在编写一个家庭作业程序,我需要验证用户输入,然后创建一个对象并将其添加到数组列表中。我已经包含了我认为是相关代码的内容,但我肯定是初学者,所以如果您需要查看其他内容,请告诉我。

我让用户输入一个字符串,然后检查它是否是双精度的。如果它不是双重的,我会抛出一个我创建的异常

     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;
    }
}

所以我的问题是...

有没有办法一步完成,检查用户输入的数字和数字是否为非负数。另一件事是,如果输入为空白,那就是结束输入循环的指令。

4

3 回答 3

2

好吧,您可以将代码更改为:

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

但问题是你是否真的愿意这样做。从设计的角度来看,在内部进行“否定”检查可能更有意义setPrice,而不是作为解析逻辑的一部分进行。

于 2012-11-30T04:30:18.977 回答
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");
    }
}

请注意创建和抛出异常的缩写形式。

于 2012-11-30T04:31:40.077 回答
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 有一些过于复杂的倾向,但它仍然是一个有效的选择
  • 不是每个人都喜欢使用注解的“魔力”,喜欢看自己眼中的代码

我敢肯定还有更多的优点/缺点,但这超出了这个答案/问题的范围。

于 2012-11-30T04:38:15.557 回答