以下是我的代码,其中一个名为car(基础类)的类之一,该类正被福特和本田(子类)继承。在主要类(不是汽车)中,我通过福特和本田打印可变汽车,它们是从汽车类继承的汽车。我面临的问题是,如果汽车设置为任何负数,则不会显示此IllegalaArgumentException。

public class car{
 protected long cars;

 public void setCars(long number) {
    if(cars < 0)
       throw new IllegalArgumentException("cars must be ≥ 0!");
             cars = number ;
 }
}

public class honda extends car{
 public String toString(){
    String st = "HONDA" + "no of cars : " + cars ;
    return st;
 }
}

public class main{
 public static void main(String[] args){

    car[] cscar = new car[10];
    for(int i = 0; i < 10; i++ ){
      cscar[0] = new honda(-100);
    }
 }
}

最佳答案

目前尚不清楚您要面对哪个问题,但是似乎您想在汽车数量为负数时实现IllegalArgumentException在子类中抛出。

所以这是应该工作的:


函数setCars应该稍作更改:当前,您正在将汽车数量设置为负数,然后引发异常。相反,您应该在设置数字之前检查数字:

public void setCars(long number) {
    if(cars < 0)
        throw new IllegalArgumentException("cars must be ≥ 0!");

    cars = number ;
}

我假设cars是基类中的变量。因此它应该是私有的,并且只能在汽车类中的任何地方通过setCars函数设置。永远不要直接设置它:

public class Car {

    private long cars;

    // ...
}

子类应该根本不覆盖setCars,或者(如果需要覆盖)首先调用父方法:

public class Honda {

    // setCars function is not overwritten here,
    // so parent function will be called
}

public class Ford {

    // setCars function is overwritten here,
    // but parent function is called first:

    @Override
    public void setCars(long number) {
        super.setCars(number);
        // if we've got here, then exception was not thrown
        // so function can do something else
    }
}



另外,您可以将父函数设置为public final void setCars,这样没人可以完全覆盖它。

上面的代码将产生预期的结果:

Honda honda = new Honda();
honda.setCars(-5); // will throw the exception

10-08 19:38