在 Java 中处理自定义异常

Working with custom Exceptions in Java

首先 post 这里和 Java 的编程新手。对于我的一项作业,我们被要求创建一个程序,该程序在数组中包含对象,这些对象是具有特定信息字段的汽车,然后我们必须使用它来通过自定义异常确定是否显示汽车。我还没有完全完成,但出于某种原因,每当我 运行 我的程序时,它总是抛出异常。任何指针的帮助将不胜感激,希望我的代码不会太糟糕!

这是我的主要内容:

package throwusedcarexceptions;

public class ThrowUsedCarExceptions {

public static void main(String[] args) {

    int vNumber, year, miles;
    String make;
    double price;

    try{
        UsedCar[] cars = new UsedCar[2];

        cars[0] = new UsedCar(1234, "Honda", 2001, 78340, 5999.99);
        cars[1] = new UsedCar(1235, "Ford", 2005, 78340, 5999.99);

        for (int i = 0; i < cars.length; i++){
            System.out.println(cars[i]);
        }
    }

    catch(UsedCarException error){
        System.out.println(error.getMessage());
    }
}

}

然后我的class判断是否抛出异常:

package throwusedcarexceptions;


public class UsedCar {

int vNumber, year, miles;
String make;
double price;

public UsedCar(int vNumber, String make, int year, int miles, double price) 
throws UsedCarException{
    setVNumber(vNumber);
    if(vNumber < 1000 || vNumber > 9999)
        throw(new UsedCarException());

    setMake(make);
    if(!"Ford".equals(make) || !"Honda".equals(make) || 
!"Toyota".equals(make) || !"Chrysler".equals(make) || !"Other".equals(make))
        throw(new UsedCarException());

    setYear(year);
    if(year < 1990 || year > 2014)
        throw(new UsedCarException());

    setMiles(miles);
    if(miles < 0)
        throw(new UsedCarException());

    setPrice(price);
    if(price < 0)
        throw(new UsedCarException());
}

public void setVNumber(int vNumber){
    this.vNumber = vNumber;
}

public void setMake(String make){
    this.make = make;
}

public void setYear(int year){
    this.year = year;
}

public void setMiles(int miles){
    this.miles = miles;
}

public void setPrice(double price){
    this.price = price;
}

public int getVNumber(){
    return vNumber;
}

public String getMake(){
    return make;
}

public int getYear(){
    return year;
}

public int getMiles(){
    return miles;
}

public double getPrice(){
    return price;
}
}

最后是我的例外 class:

package throwusedcarexceptions;


public class UsedCarException extends Exception {

public UsedCarException(){
    super("Error: Not a valid input");
}
}

感谢您的宝贵时间!

这条语句:

if(!"Ford".equals(make) || !"Honda".equals(make) || 
        !"Toyota".equals(make) || !"Chrysler".equals(make) || 
        !"Other".equals(make))
    throw(new UsedCarException());

将始终抛出异常,因为 make 将不等于所有(或除一个之外的所有)品牌。你可能想要这个:

if(!("Ford".equals(make) || "Honda".equals(make) || 
        "Toyota".equals(make) || "Chrysler".equals(make) || 
        "Other".equals(make)))
    throw(new UsedCarException());

否则只需将所有 || 更改为 &&

首先,当您抛出异常时,最好记录它(System.out 在这种情况下就足够了)并打印有关发生的事情和地点的详细信息 - 例如,导致的值例外。所以至少使用:

public UsedCarException(String message) {
    super("Error: Not a valid input " + message);
}

问题出在当 make 等于 Honda 时被评估为 true 的行:

if (!"Ford".equals(make) || !"Honda".equals(make) || !"Toyota".equals(make) || 
    !"Chrysler".equals(make) || !"Other".equals(make)) {throw (new UsedCarException());}

请使用{}。将其上方的行更改为以下行,或者随意应用 De Morgan 定律,其中 !(A or B) 等于 (!A and !B).

if (!(
    "Ford".equals(make)   || "Honda".equals(make) || "Toyota".equals(make) || 
    "Chrysler".equals(make) || "Other".equals(make))) 
{
        throw (new UsedCarException());
}

最后,这还是一个很丑的状态。为什么不检查该值是否包含在数组或列表中?

List<String> list = Arrays.asList("Ford", "Honda", "Toyota", "Chrysler", "Other");
if (!list.contains(make)) {
    throw (new UsedCarException());
}