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

Ans*_*hul 1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

当在第10行独立地添加片段1-4时,这是真的吗?(选择所有适用的选项.)

  • A.没有人会编译
  • B.他们都会编译
  • C.有些但不是全部会编译
  • D.所有编译的都将在运行时抛出异常
  • E.编译的那些都不会在运行时抛出异常
  • F.只有一些编译的会在运行时抛出异常

答案:C和D是正确的.重写方法不能抛出比重写方法抛出的更广泛的已检查异常.但是,重写方法可能会抛出被重写方法抛出的RuntimeExceptions.基于上述情况,A,B,E和Fare不正确.(目标2.4)

在这种情况下,我没有得到BoldItalic标记所说的内容.重写方法(#4)不会抛出任何异常,因此我们如何知道我们添加到重写方法(选项2)的那个(在这种情况下是MyException)是否比重写方法更广泛.Arithmetic异常是如何运行的,没有错误.它如何不比最重要的方法中的不知道哪个例外更广泛.

nif*_*nif 5

您可以覆盖void doStuff() { }使用其中一个选项不会引发异常的方法.让我们一个接一个地看看它们:

void doStuff() { .. }
Run Code Online (Sandbox Code Playgroud)

这个没关系,它不像基本方法那样抛出Exception.

void doStuff() throws MyException { .. }
Run Code Online (Sandbox Code Playgroud)

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

void doStuff() throws RuntimeException { ... }
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为它RuntimeException是一个未经检查的异常.

void doStuff() throws ArithmeticException { ... }
Run Code Online (Sandbox Code Playgroud)

这也可以,因为ArithmeticException是一个RuntimeException,所以没有检查.