“重写方法不会抛出异常”?

时间:2016-11-23 01:40:56

标签: java

我正在编写一个演示继承和覆盖方法的程序。我想创建一个涉及使用异常的if语句。我在if语句中包含异常,但是当我在方法的开头写“throws exception”时,我得到n错误消息,说“”重写方法不会抛出异常“。这是代码:

子类

x

超级

range(1, x + 1)

感谢您提供有关如何重新编写此内容以便正确抛出异常的任何帮助。

3 个答案:

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