Java:抛出和捕获异常以验证输入的正确方法
我正在为家庭作业编写一个程序,我需要验证用户输入,然后创建一个对象并将其添加到数组列表中。我已经包括了我认为是相关的代码,但我肯定是一个初学者,所以让我知道如果有其他东西你需要看到 我让用户输入一个字符串,然后检查它是否是双精度的。如果不是double,则抛出我创建的异常Java:抛出和捕获异常以验证输入的正确方法,java,exception-handling,try-catch,Java,Exception Handling,Try Catch,我正在为家庭作业编写一个程序,我需要验证用户输入,然后创建一个对象并将其添加到数组列表中。我已经包括了我认为是相关的代码,但我肯定是一个初学者,所以让我知道如果有其他东西你需要看到 我让用户输入一个字符串,然后检查它是否是双精度的。如果不是double,则抛出我创建的异常 try{ price = Double.parseDouble(strPrice); } catch(NumberFormatException nfe){ CDE
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;
}
}
所以我的问题是
是否有一种方法可以在一个步骤中完成此操作,请检查用户是否输入了一个数字,以及该数字是否为非负数。另一件事是,如果输入为空,则是结束输入循环的指令。那么,您可以将代码更改为:
try {
price = Double.parseDouble(strPrice);
if (price < 0) {
throw new CDException("Can't be negative");
}
} catch (NumberFormatException ex) {
...
}
但问题是你是否真的愿意这样做。从设计角度来看,在setPrice中进行否定检查可能更有意义,而不是作为解析逻辑的一部分进行检查。好的,您可以将代码更改为:
try {
price = Double.parseDouble(strPrice);
if (price < 0) {
throw new CDException("Can't be negative");
}
} catch (NumberFormatException ex) {
...
}
但问题是你是否真的愿意这样做。从设计角度来看,在setPrice中进行否定检查可能更有意义,而不是作为解析逻辑的一部分进行检查。在我看来,将其拆分为单独的函数更好。您可以更好地分离关注点,从而促进代码重用。这是一个非常简单的“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");
}
}
请注意用于创建和抛出异常的缩写形式。在我看来,将其拆分为单独的函数更好。您可以更好地分离关注点,从而促进代码重用。这是一个非常简单的“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");
}
}
请注意创建和抛出异常的缩写形式。我知道这是为了家庭作业,您的课堂老师可能不会接受这个答案,但在现实世界中,我会使用验证框架,而不是重新设计轮子,例如Java EE 6中的内置框架: 以下是使用它们的教程: 一些例子:
public class CD {
@NotNull
@Size(min=1, max=16)
private String CDName;
@Digits(integer=6, fraction=2)
BigDecimal price;
}
利益
不要重复,例如,声明验证一次
可读性很强,而且有文档记录
缺点
JavaEE有一些过于复杂化的倾向,但它仍然是一个有效的选择
不是每个人都喜欢使用注释的魔力,也不是每个人都喜欢看到自己眼中的代码
我肯定有更多的优点/缺点,但这超出了这个答案/问题的范围。我知道这是为了家庭作业,你的课堂老师可能不会接受这个答案,但在现实世界中,我会使用验证框架,而不是重新发明轮子,例如Java EE 6中的内置框架: 以下是使用它们的教程: 一些例子:
public class CD {
@NotNull
@Size(min=1, max=16)
private String CDName;
@Digits(integer=6, fraction=2)
BigDecimal price;
}
利益
不要重复,例如,声明验证一次
可读性很强,而且有文档记录
缺点
JavaEE有一些过于复杂化的倾向,但它仍然是一个有效的选择
不是每个人都喜欢使用注释的魔力,也不是每个人都喜欢看到自己眼中的代码
我肯定还有更多的优点/缺点,但这超出了这个答案/问题的范围。您的代码看起来很棒。我提供的唯一建议是将消息参数传递给异常构造函数。感谢您的输入和建议。我们正在使用一个由教师提供的异常类。您的代码看起来很棒。我提供的唯一建议是将消息参数传递给异常构造函数。感谢您的输入和建议。我们正在使用老师为我们提供的一个例外类