以下是我的代码,其中一个名为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