throws用于声明方法可能抛出但不处理的受检异常,强制调用者处理;必须声明未捕获的受检异常,可声明多个用逗号分隔,子类重写时不能扩大异常范围。

在 Java 中,throws 关键字用于在方法签名中声明该方法**可能抛出但不处理**的受检异常(checked exception),告诉调用者“你得为这个异常负责”。它不处理异常,只是传递责任。
什么时候必须用 throws
当方法体内调用了可能抛出受检异常(如 IOException、SQLException)的代码,而你又不想用 try-catch 捕获它时,就必须在方法声明后加上 throws 异常类名。
- 编译器会强制要求:不处理也不声明 → 编译失败
- 运行时异常(如
NullPointerException、ArrayIndexOutOfBoundsException)属于非受检异常,无需也不建议用 throws 声明 - 可以声明多个异常,用逗号分隔
基本写法和语法格式
格式:修饰符 返回类型 方法名(参数列表) throws 异常类1, 异常类2 { ... }
例如:
立即学习“Java免费学习笔记(深入)”;
public void readFile(String path) throws IOException {
FileReader fr = new FileReader(path); // 可能抛出 IOException
int data = fr.read();
fr.close();
}
调用这个方法的地方,要么用 try-catch 处理,要么继续向上 throws —— 责任链不能中断。
子类重写时 throws 的限制
子类重写父类方法时,不能抛出比父类更宽泛的受检异常:
- 可以抛出相同的异常
- 可以抛出父类异常的子类(范围更小)
- 可以不抛出任何异常(即去掉 throws)
- 但不能新增或换成父类异常的父类(比如父类 throws IOException,子类不能 throws Exception)
常见误区提醒
• throws 不等于 throw:前者是声明,后者是主动抛出异常实例
• throws 后面写的是异常类型(类名),不是对象
• 即使方法体里没直接写 throw 语句,只要调用了可能抛异常的 API(如 FileInputStream 构造方法),就得声明
• 如果同时有受检和非受检异常,throws 只需写受检的 —— 非受检的编译器不管


















