子类重写父类方法时,受检异常声明范围不得放宽:只能缩小或保持不变,不可新增或扩大;运行时异常不受限制;子类构造器须处理父类构造器抛出的受检异常。

子类在重写父类方法时,对异常声明的处理需遵循“异常约束不能放宽”的原则:子类方法声明的异常范围必须小于或等于父类方法声明的异常范围。
子类方法可以不声明任何异常
如果父类方法声明了受检异常(checked exception),子类重写该方法时可以选择不抛出任何异常,前提是方法体内部能妥善处理所有可能的异常(如用 try-catch 捕获并消化)。
- 父类方法:void doWork() throws IOException
- 子类可写为:void doWork() { /* 内部用 try-catch 处理 IOException */ }
- 这是合法且常见做法,尤其当子类使用更稳定的实现(如内存操作替代文件读写)时
子类只能缩小或保持受检异常类型
子类方法 throws 子句中列出的受检异常,必须是父类对应方法所声明异常的子类型,或完全相同;不能新增、不能使用父类异常的父类(即不能扩大范围)。
- 父类声明 throws SQLException → 子类可声明 throws SQLTimeoutException(它是 SQLException 的子类)
- 父类声明 throws IOException → 子类不能声明 throws Exception 或 Throwable
- 父类声明 throws IOException → 子类声明 throws FileNotFoundException(合法,因是 IOException 子类)
运行时异常(unchecked)不受限制
对于 RuntimeException 及其子类(如 NullPointerException、IllegalArgumentException),子类方法可自由声明、抛出或不声明,编译器不检查,也不受父类 throws 子句约束。
立即学习“Java免费学习笔记(深入)”;
- 父类方法未声明异常,子类重写时仍可 throw IllegalArgumentException
- 父类 throws IOException,子类可在方法内 throw new IllegalStateException(),无需出现在 throws 中
- 这类异常体现的是编程逻辑问题,而非调用契约的一部分
构造器继承与异常声明需单独处理
子类构造器不会自动继承父类构造器,但会隐式或显式调用父类构造器。若父类构造器声明了受检异常,子类构造器必须处理它:要么在 throws 中声明相同或更具体的异常,要么用 try-catch 捕获。
- 父类:MyParent() throws ParseException
- 子类构造器可写为:MyChild() throws ParseException { super(); }
- 或:MyChild() { try { super(); } catch (ParseException e) { throw new RuntimeException(e); } }
- 不能忽略父类构造器抛出的受检异常


















