Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:抛出和捕获异常以验证输入的正确方法_Java_Exception Handling_Try Catch - Fatal编程技术网

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

Java:抛出和捕获异常以验证输入的正确方法,java,exception-handling,try-catch,Java,Exception Handling,Try Catch,我正在为家庭作业编写一个程序,我需要验证用户输入,然后创建一个对象并将其添加到数组列表中。我已经包括了我认为是相关的代码,但我肯定是一个初学者,所以让我知道如果有其他东西你需要看到 我让用户输入一个字符串,然后检查它是否是双精度的。如果不是double,则抛出我创建的异常 try{ price = Double.parseDouble(strPrice); } catch(NumberFormatException nfe){ CDE

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

我让用户输入一个字符串,然后检查它是否是双精度的。如果不是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;
    }
}
所以我的问题是

是否有一种方法可以在一个步骤中完成此操作,请检查用户是否输入了一个数字,以及该数字是否为非负数。另一件事是,如果输入为空,则是结束输入循环的指令。

那么,您可以将代码更改为:

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有一些过于复杂化的倾向,但它仍然是一个有效的选择 不是每个人都喜欢使用注释的魔力,也不是每个人都喜欢看到自己眼中的代码
我肯定还有更多的优点/缺点,但这超出了这个答案/问题的范围。

您的代码看起来很棒。我提供的唯一建议是将消息参数传递给异常构造函数。感谢您的输入和建议。我们正在使用一个由教师提供的异常类。您的代码看起来很棒。我提供的唯一建议是将消息参数传递给异常构造函数。感谢您的输入和建议。我们正在使用老师为我们提供的一个例外类