Java:方法覆盖时的异常声明


class MyException extends Exception { }
class Tire {
    void doStuff() { }                                    //   #4
} 
public class Retread extends Tire {
    public static void main(String[] args) {
        new Retread().doStuff();
    }
    // insert code here
    System.out.println(7/0);
}

并给定以下四个代码片段:

  1. void doStuff() {
  2. void doStuff() throws MyException {
  3. void doStuff() throws RuntimeException {
  4. void doStuff() throws ArithmeticException {

当在第 10 行独立添加片段 1 - 4 时,哪个是正确的?(选择所有适用项。

  • 一个。没有一个会编译
  • 二.他们都会编译
  • 三.一些(但不是全部(将编译
  • D.所有编译的都将在运行时引发异常
  • E.编译的那些都不会在运行时引发异常
  • F.只有一些编译的会在运行时引发异常

答:C 和 D 是正确的。重写方法不能引发比重写方法引发的异常更广泛的已检查异常。但是,重写方法可以引发未由重写方法引发的运行时异常。基于上述情况,A、B、E 和票价不正确。(目标2.4(

在这种情况下,我不明白粗斜体标记在说什么。重写方法不会引发任何异常,因此我们如何知道我们添加到重写方法(选项2(中的那个(在本例中为MyException(是否比重写方法更广泛。算术异常如何运行而没有错误。它怎么不比覆盖方法中的不知道哪个异常更广泛。

您可以覆盖方法void doStuff() { },该方法不会对其中一个选项引发异常。因此,让我们一一看一下:

void doStuff() { .. }

这个没关系,它不像基方法那样抛出异常。

void doStuff() throws MyException { .. }

这个不会编译。 MyException是已检查的异常,因为它扩展了Exception,并且基方法根本不声明任何已检查的异常。

void doStuff() throws RuntimeException { ... }

这将起作用,因为RuntimeException是未经检查的异常。

void doStuff() throws ArithmeticException { ... }

这也行得通,因为ArithmeticExceptionRuntimeException ,所以不受选中。

void doStuff(( { }

没有抛出任何已检查的异常。

所以重写方法也不应该抛出任何检查过的异常,

虽然它可以抛出运行时异常(不需要提及声明(。

如果重写的方法不引发检查异常,则重写方法也不能引发。抛出选中的异常对编译时没有任何意义。你可以抛出运行时异常的任何子类,而不说这种方法会抛出等等。

运行时异常通常是错误和

开发错误,例如空指针异常和算术异常。在将这些指针/值发送到方法之前,您需要检查它们。否则,程序崩溃。

Hovewer,除了尝试/捕获之外,您与检查的异常无关。它们可能有多种原因,例如连接错误、文件系统错误、操作系统权限等。

最新更新