Java 中抽象类中抽象方法能抛异常吗
可以。在 java 的抽象类中,抽象方法完全可以声明抛出异常。这通过 throws 关键字实现,它规定了所有非抽象子类在重写(override)该方法时必须遵循的契约:子类要么处理该异常,要么继续向上抛出同类型或更宽泛的异常,且不能抛出比父类声明更宽泛的新异常。

子类重写时如何处理父类声明的异常
子类在实现抽象方法时,必须遵守 throws 子句的约束。如果父类抽象方法声明了 throws IOException,子类实现时可以选择抛出 IOException、其子类(如 FileNotFoundException),或者不抛出任何异常(即内部完全捕获并处理)。但子类绝对不能抛出父类未声明的、更宽泛的异常(如 Exception),否则编译会报错。

掌握 ES6+ 特性,包括 async/await、解构、扩展运算符、箭头函数、Promise、模块、迭代器、生成器以及函数式编程模式,编写简洁高效的 Java
import java.io.IOException;
// 1. 定义抽象基类
abstract class DataProcessor {
// 抽象方法声明抛出 IOException
public abstract void process() throws IOException;
}
// 2. 合法的重写:抛出相同异常
class SafeProcessor extends DataProcessor {
@Override
public void process() throws IOException {
System.out.println("Safe processing");
// 模拟可能抛出异常的操作
throw new IOException("Simulated error");
}
}
// 3. 合法的重写:不抛出异常(内部处理)
class SilentProcessor extends DataProcessor {
@Override
public void process() {
try {
System.out.println("Silent processing");
throw new IOException("Caught internally");
} catch (IOException e) {
System.out.println("Error handled silently: " + e.getMessage());
}
}
}
public class Main {
public static void main(String[] args) {
DataProcessor p1 = new SafeProcessor();
try {
p1.process();
} catch (IOException e) {
System.out.println("Caught in main: " + e.getMessage());
}
DataProcessor p2 = new SilentProcessor();
p2.process(); // 无需 try-catch
}
}
运行结果:
Caught in main: Simulated error
Silent processing
Error handled silently: Caught internally
具体输入下不同子类的行为差异
基于上述代码,当调用 process() 时,实际行为取决于具体实例化的子类。对于 SafeProcessor,异常会被抛出到调用者;对于 SilentProcessor,异常被内部消化,不会向外传播。这种差异体现了抽象类在定义接口规范的同时,允许子类灵活决定异常处理策略的能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










