MST

星途 面试题库

面试题:Java抽象类重写时的异常处理规则

当重写Java抽象类中的抽象方法时,对于异常处理有哪些规则需要遵循?如果父类抽象方法声明抛出某种受检异常,子类重写该方法时能否改变异常类型或者不抛出异常?请详细说明并给出代码示例。
26.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 异常处理规则

    • 子类重写父类抽象方法时,不能抛出比父类抽象方法声明的受检异常更宽泛的异常类型。例如,如果父类方法声明抛出IOException,子类重写方法不能抛出Exception(因为ExceptionIOException更宽泛)。
    • 子类重写方法可以抛出与父类抽象方法声明的受检异常相同类型的异常,或者是其父类抽象方法声明的受检异常的子类类型异常。例如,如果父类方法声明抛出IOException,子类重写方法可以抛出FileNotFoundException(因为FileNotFoundExceptionIOException的子类)。
    • 子类重写方法也可以不抛出任何受检异常,即使父类抽象方法声明抛出了受检异常。
  2. 父类抽象方法声明抛出某种受检异常,子类重写该方法时的情况

    • 能否改变异常类型
      • 不能改变为更宽泛的异常类型。如上述所说,不能将父类声明的IOException改变为Exception
      • 可以改变为子类类型异常,例如父类声明IOException,子类可以抛出FileNotFoundException
    • 能否不抛出异常:可以不抛出异常。
  3. 代码示例

// 抽象父类
abstract class Parent {
    abstract void someMethod() throws IOException;
}

// 子类
class Child extends Parent {
    // 子类重写方法抛出相同类型异常
    @Override
    void someMethod() throws IOException {
        // 具体实现
        throw new IOException();
    }
}

class AnotherChild extends Parent {
    // 子类重写方法抛出子类类型异常
    @Override
    void someMethod() throws FileNotFoundException {
        // 具体实现
        throw new FileNotFoundException();
    }
}

class YetAnotherChild extends Parent {
    // 子类重写方法不抛出异常
    @Override
    void someMethod() {
        // 具体实现
    }
}