【问题标题】:Working with custom Exceptions in Java在 Java 中使用自定义异常
【发布时间】:2018-07-27 18:53:24
【问题描述】:

在这里的第一篇文章和一个新的 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());
    }
}

}

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

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

最后是我的异常类:

package throwusedcarexceptions;


public class UsedCarException extends Exception {

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

感谢您的宝贵时间!

【问题讨论】:

  • 当您从构造函数调用设置器时:为什么不将检查和异常引发放入设置器中?这样,当在对象上调用其中一个设置器时,您也将拥有它。
  • 我正在考虑这个问题,但我们的任务说无论出于何种原因,我们都要在构造函数中引发异常,所以我就把它留在那里。
  • 然后考虑不添加setter。在讨论中提出!

标签: java arrays exception exception-handling try-catch


【解决方案1】:

此声明:

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());

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

【讨论】:

  • 我会尽快做这些调整,谢谢你的建议!我以为这就是我的问题所在,但我不太确定。感谢您的帮助!
【解决方案2】:

首先,当您抛出异常时,最好记录它(在这种情况下,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());}

请使用{}。将其上面的行更改为以下行,或者随意应用德摩根定律,其中!(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());
}

【讨论】:

  • 感谢您的详细解答!我非常感谢有关记录异常的建议,这绝对是一个绝妙的主意。我们这周才开始了解它们,所以对我来说一切都是新鲜的。另外,最后一个建议是个好主意。尴尬的是,这是一个 2 级课程,我在第一级学习很少,所以我在数组方面不是最好的,什么不是。以后我会记下来的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2015-04-25
  • 2021-10-16
  • 2016-02-02
相关资源
最近更新 更多