1
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 时,哪些是正确的?(选择所有适用的。)

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

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

在这种情况下,我不明白 BoldItalic 标记在说什么。覆盖方法(#4)不会抛出任何异常,所以我们如何知道我们添加到覆盖方法(选项 2)中的那个(在本例中为 MyException)是否比覆盖方法更广泛。算术异常如何运行而没有错误。它如何不比覆盖方法中的不知道哪个异常更广泛。

4

3 回答 3

5

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

void doStuff() { .. }

这个没问题,它不会像基本方法那样抛出异常。

void doStuff() throws MyException { .. }

这个不会编译。MyException是一个受检异常,因为它扩展Exception并且基方法根本没有声明任何受检异常。

void doStuff() throws RuntimeException { ... }

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

void doStuff() throws ArithmeticException { ... }

这也可以,因为ArithmeticException是 a RuntimeException,所以未选中。

于 2013-07-01T19:10:45.050 回答
1

无效 doStuff() { }

没有抛出任何检查异常。

所以覆盖方法也不应该抛出任何检查异常,

尽管它可以抛出运行时异常(声明时无需提及)。

于 2013-07-01T20:25:05.433 回答
0

如果被覆盖的方法没有抛出检查异常,那么覆盖的方法也不能抛出。抛出检查异常对编译时间没有任何意义。您可以抛出运行时异常的任何子类,而不必说此方法会抛出等等。

运行时异常一般是bug和开发错误,比如nullpointerexception和算术异常。在将它们发送到方法之前,您需要检查这些类型的指针/值。否则,程序会崩溃。

但是,除了 try/catch 之外,您与检查的异常无关。它们可能有很多原因,例如连接错误、文件系统错误、操作系统权限等。

于 2013-07-01T19:10:21.380 回答