java要求方法若可能抛出受检异常,必须在签名中用throws显式声明,调用者须try-catch或继续throws;子类重写时只能缩小或保持受检异常范围。

在 Java 中,如果一个方法内部可能抛出受检异常(Checked Exception),就必须在方法签名中用 throws 关键字显式声明,否则编译不通过。这是 Java 强制要求的错误处理机制,目的是让调用者明确知道该方法可能出错,并主动处理。
在方法声明末尾添加 throws 子句
语法格式为:修饰符 返回类型 方法名(参数列表) throws 异常类1, 异常类2 { ... }
- 多个异常用英文逗号分隔,不需要继承关系,但建议按具体到宽泛的顺序写(如
FileNotFoundException在前,IOException在后) - 只需声明受检异常(即继承自
Exception但不是RuntimeException及其子类的异常),运行时异常(如NullPointerException)无需声明 - 示例:
public void readFile(String path) throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream(path); // 可能抛出 FileNotFoundException
int data = fis.read(); // 可能抛出 IOException
}
调用者必须处理或继续上抛
一旦方法声明了受检异常,所有调用它的代码都必须:要么用 try-catch 捕获,要么在自己的方法签名中也用 throws 声明
- 不能“忽略”——直接调用却不处理会编译报错
- 若选择上抛,需确保调用链最顶层(如
main方法)最终处理,否则程序无法编译通过 - 示例:
public static void main(String[] args) {
try {
readFile("test.txt");
} catch (FileNotFoundException e) {
System.err.println("文件未找到:" + e.getMessage());
} catch (IOException e) {
System.err.println("读取失败:" + e.getMessage());
}
}
子类重写方法时的 throws 规则
子类重写父类方法时,不能抛出比父类方法更多或更宽泛的受检异常
- 可以抛出相同的异常、更具体的异常(子类),或不抛出任何受检异常
- 例如:父类方法声明
throws IOException,子类可声明throws FileNotFoundException(它是IOException的子类),但不能声明throws Exception - 这条规则保障了多态调用的安全性——调用者按父类签名写的处理逻辑,在子类调用时依然有效
常见误区提醒
容易混淆的地方要特别注意:
-
throws是声明“可能抛出”,不是“一定会抛出”。即使方法体里没有throw语句,只要调用了其他可能抛出受检异常的方法,就得声明 - 不要把运行时异常(如
IllegalArgumentException)写进throws——编译器不会强制,写了也没错,但违背设计意图 - 如果一个方法既抛出受检异常又抛出运行时异常,只声明前者即可;后者由调用者自行决定是否捕获
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











