当前位置: 首页 > 面试题库 >

有异常的覆盖方法

柳宪
2023-03-14
问题内容

因此,这是该书的引文:

覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。

现在这是我的问题,如果超类中的方法引发异常,那么重写方法可以根本不引发异常吗?

因为我只是在Java中尝试过,所以重写方法没有引发任何异常,因此没有错误。

请解释。


问题答案:

您可以声明一个重写方法,使其抛出的异常类型比超类少,而您不能引入新的异常。子类方法必须与超类方法的行为兼容。更准确地说,您必须能够在不破坏任何内容的情况下用子类的对象替换超类的对象(在throws子句中添加新的已检查异常将意味着调用它的事物将必须更改其代码以对其进行处理)。

(这背后的想法是Liskov替换原理:程序应该能够在不涉及任何确切类型细节的情况下高层次地处理对象。如果子类可以引入更改,则意味着程序必须选择它们并以不同的方式处理它们,这将破坏抽象的目的。)

因此,可以将一个覆盖方法声明为根本不引发任何检查异常(通过完全省略throws子句),因为这不需要更改任何调用方。

JDK中有一些示例,例如java.io中的示例,其中子类不可能抛出由超类声明的异常(请参见ByteArrayOutputStream
close方法)。在这里,close方法可能已删除了throws子句,因为它从不抛出IOException。(也许是有人希望使用确实引发IOException的版本将其子类化吗?)



 类似资料:
  • 问题内容: 我正在浏览Kathe sierra编写的SCJP 6,并遇到了有关以重写方法引发异常的解释。我真的不明白。有人可以向我解释吗? 覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的

  • 我在覆盖接口中声明的方法时遇到了一些问题,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我编写了以下代码接口 通过javac运行,我得到 请注意,在接口中,metodoA和metodoB之间的唯一区别在于它们的参数。 为什么Implementadora(Implementadora)的metodoB(metodoB)(代码)不重写Interfaz(代码),但重写metodoB(

  • 问题内容: 这个想法有些含糊不清,我需要澄清。 我的问题是使用此代码时: 输出为。 这是因为main函数与method在同一类中,还是由于重写? 我已经在书中读过这个想法,当我将该函数放在另一个类中时,会出现编译器错误。 问题答案: 您不能覆盖方法。如果投射到,则看不到。您 可以 覆盖一个方法,但这不是您要在此处执行的操作(是的,在这里,如果将移至,则会得到另一个方法。我建议您在打算覆盖时注解,

  • 问题内容: 在Java中重写私有方法是无效的,因为父类的私有方法是“自动最终的,并且对派生类是隐藏的”。我的问题主要是学术上的。 不允许父级的私有方法被“重写”(即,在子类中以相同的签名独立实现),这是否违反封装规范?根据封装的原理,子类不能访问或继承父级的私有方法。它是隐藏的。 那么,为什么应该限制子类实现自己的具有相同名称/签名的方法呢?这是否有一个良好的理论基础,还是仅仅是某种务实的解决方案

  • 我正试图使用Eclipse和EclEmma在java中覆盖我的代码。 我的测试使用JUnit 4,我有一些测试看起来像这样: EclEmma说测试失败是因为抛出了一个IllegalArgumentExc0019。所以它会丢弃我的代码覆盖率指标,即使它应该抛出一些东西。有没有一个选项可以让它看到JUnit期望的异常标签? 编辑:我发现,如果您将抛出添加到测试声明中,它也可以工作!

  • 我不熟悉java、Junit和jacoco。我正在做下面的异常处理。我也在捕获异常类,以防该方法抛出之前未捕获的任何其他异常。 在Junit测试中,尝试如下。当我有运行时的任何异常时,我抛出的总是运行时异常捕获块本身,除非我抛出异常。我可以尝试其他哪个选中的异常,使其进入异常捕获块。因此,我无法获得所需的代码覆盖率。 谢谢你的帮助。