我正在为家庭作业编写一个程序,我需要验证用户输入,然后创建一个对象并将其添加到数组列表中。我已经包含了我认为相关的代码,但我确实是初学者,所以如果你还需要其他东西,请告诉我。
我让用户输入一个字符串,然后检查它是否为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;
}
}
所以我的问题是......
有没有办法一步完成,检查用户输入的数字和数字是非负数。另一件事是如果输入是空白的,那就是结束输入循环的指令。
答案 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;
}
优势
缺点
我确信有更多优点/缺点,但这不属于这个答案/问题的范围。