Java:抛出并捕获异常以验证输入的正确方法

时间:2012-11-30 04:21:27

标签: java exception-handling try-catch

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

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

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

所以我的问题是......

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

在我看来,将它拆分为单独的函数会更好。您可以更好地分离关注点,从而促进代码重用。如果你坚持组合这些功能(我不认为你应该这样做),这是一个非常简单的'mashup':

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 :(得分: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有一些过于复杂化的倾向,但它仍然是一个有效的选择
  • 并非所有人都喜欢使用注释的“魔术”,并喜欢看他们眼中的代码

我确信有更多优点/缺点,但这不属于这个答案/问题的范围。