我正在编写一个演示继承和覆盖方法的程序。我想创建一个涉及使用异常的if语句。我在if语句中包含异常,但是当我在方法的开头写“throws exception”时,我得到n错误消息,说“”重写方法不会抛出异常“。这是代码:
子类
x
超级
range(1, x + 1)
感谢您提供有关如何重新编写此内容以便正确抛出异常的任何帮助。
答案 0 :(得分:0)
根据您的代码,您已经提到实现的方法eat(Food x)可以抛出一个异常,即java.lang.Exception。此java.lang.Exception是异常层次结构中所有Exception类的超类。因此除了已检查和未检查的异常外,它都是例外。根据重写规则,如果超类方法不抛出任何异常,则覆盖子类中的方法时可以抛出RunTimeExceptions。
所以根据你的代码,supper类方法是
abstract public Food eat(Food x);
上述方法不会抛出任何异常
所以如果你在下面的代码中编写代码,那么在子类中覆盖它时,你将得到编译时异常
public Food eat(Food x) throws Exception
{
//do your work
}
但可以按照以下方式完成。
public Food eat(Food x) throws RunTimeException
{
}
希望你能得到答案。
答案 1 :(得分:-1)
由于您应该能够安全地将任何子类替换为超类型实例,因此无法添加不在重写方法中的已检查异常。在这种情况下,您可以将throws Exception
添加到Animal#eat(Food)
方法中,也可以将其从Carnivore
中删除。
然而,实际上只抛出一个普通的Exception
类几乎总是一个坏主意;有许多具有意义的个别课程。在您的情况下,您应该抛出IllegalArgumentException
,当方法调用失败时,这是正确的类型,因为提供的参数不合适。这是一个未经检查的异常,不需要throws子句。
请注意,x.equals("Plants")
几乎肯定是检查的错误方法。使用Food
方法提供type()
方法,该方法返回枚举值,因此x.type() == Foods.PLANTS
或提供布尔isPlant()
方法,因此x.isPlant()
。
答案 2 :(得分:-1)
您必须尊重继承中的签名,并且已检查的异常是Java中方法签名的一部分。
由于您没有定义超级类中可能会抛出“异常”。食肉动物也不能抛出异常。因此,如果你认为方法是设计最终抛出异常 - 也在你的超类中定义它。
另一种可能性是使用Runtime Exception,它可以适应这种流程。例如,您可以删除throws Exception
并将Exception替换为illegalArgumentException - 这是一个更适合此目的的异常。
示例:
public Food eat(Food x) {
if (x.equals("Plants")) {
throw new IllegalArgumentException("Carnivores only eat meat!");
} else {
return x;
}
}