Java:方法重写时的异常声明

时间:2013-07-01 19:00:06

标签: 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 {
  5. 当在第10行独立地添加片段1-4时,这是真的吗? (选择所有适用的选项。)

    • 甲。无编译
    • B中。他们都将编译
    • ℃。一些(但不是全部)将编译
    • d。所有编译的都将在运行时抛出异常
    • 电子。编译的那些都不会在运行时抛出异常
    • F。只有部分编译者会在运行时抛出异常

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

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

3 个答案:

答案 0 :(得分:5)

重写方法void doStuff() { },它会使用其中一个选项抛出异常。所以,让我们一个接一个地看看它们:

void doStuff() { .. }

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

void doStuff() throws MyException { .. }

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

void doStuff() throws RuntimeException { ... }

这样可行,因为RuntimeException是未经检查的例外。

void doStuff() throws ArithmeticException { ... }

这也可以,因为ArithmeticExceptionRuntimeException,所以未经检查。

答案 1 :(得分:1)

void doStuff(){}

不会抛出任何已检查的例外。

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

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

答案 2 :(得分:0)

如果重写的方法没有抛出已检查的异常,则覆盖方法也不能抛出。抛出已检查的异常对编译时没有任何意义。你可以抛出Runtime Exception的任何子类,而不会说这个方法会抛出等等。

运行时异常通常是错误和开发错误,例如nullpointerexception和arithmeticexception。在将它们发送到方法之前,您需要检查这些指针/值。否则,程序崩溃。

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