throws用于声明方法可能抛出但不处理的受检异常,语法为“修饰符 返回类型 方法名(参数) throws 异常类1, 异常类2”,仅对Checked Exception强制要求,且子类重写时异常范围不能扩大。

在 Java 中,throws 关键字用于方法签名中声明该方法**可能抛出但不处理**的受检异常(checked exception),告诉调用者“你得负责处理这些异常”。它不抛出异常,只是做契约式声明。
语法格式:写在方法参数列表后、方法体前
基本写法如下:
修饰符 返回类型 方法名(参数列表) throws 异常类1, 异常类2 { ... }
例如:
立即学习“Java免费学习笔记(深入)”;
public void readFile(String path) throws IOException, FileNotFoundException {
FileReader fr = new FileReader(path); // 可能抛出这两个受检异常
}
注意:多个异常用英文逗号分隔,顺序无关;throws 后只能是 异常类名(不能是对象),且必须是 Throwable 的子类。
只对受检异常强制要求声明
Java 区分两类异常:
-
受检异常(Checked Exception):如
IOException、SQLException,编译器强制你处理(try-catch)或声明(throws) -
非受检异常(Unchecked Exception):如
NullPointerException、ArrayIndexOutOfBoundsException,继承自RuntimeException或Error,throws声明不是必须的,写了也不报错,但通常不写
子类方法声明不能比父类更宽泛
重写方法时,throws 子句要遵循“异常范围只能缩小或不变”的规则:
- 可以抛出父类方法声明的异常的子类(如父类声明
throws IOException,子类可写throws FileNotFoundException) - 可以减少异常数量(如父类声明两个异常,子类只声明其中一个或都不声明)
- 不能新增未在父类中声明的受检异常(否则编译失败)
常见误区提醒
-
throws不等于throw:前者是声明,后者是主动抛出异常实例 - 一个方法可以有
throws,但内部未必真的执行了会抛异常的代码(编译器只看签名和调用链) - 如果方法内调用了其他声明
throws的方法,而自己又没try-catch,就必须在自己签名中throws相同或其父类异常


















