throws用于声明方法可能抛出的受检异常,调用者必须处理;语法为方法签名后加throws异常类名,可多个逗号分隔;子类重写时不能扩大受检异常范围。

在 Java 中,throws 关键字用于声明一个方法可能抛出但不处理的异常,把异常责任交给调用者处理。它不解决异常,只是“甩锅”给上层——让编译器知道:“这个方法可能会出问题,你调用它时得自己兜着。”
什么时候必须用 throws?
当方法体内出现了受检异常(checked exception)(如 IOException、SQLException),而你又不想在当前方法里用 try-catch 捕获处理,就必须用 throws 声明,否则编译不通过。
- 非受检异常(unchecked),比如
NullPointerException、ArrayIndexOutOfBoundsException,可以不声明,加了也不报错,但通常没必要 - 构造方法、普通方法、静态方法都可以使用
throws - 一个方法可声明多个异常,用逗号分隔
基本语法和写法
在方法签名末尾添加 throws 异常类名,支持单个或多个:
void readFile() throws IOException { ... }
void process() throws IOException, SQLException { ... }
如果父类方法声明了 throws,子类重写时:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
- 不能抛出比父类更宽泛的受检异常(比如父类 throws
IOException,子类不能 throwsException) - 可以抛出更具体的异常(如
FileNotFoundException),也可以不抛 - 可以减少甚至去掉 throws(只要不违反异常继承规则)
调用方必须响应 throws 声明
一旦方法声明了受检异常,所有调用它的代码都必须处理:要么用 try-catch 捕获,要么继续用 throws 往上传。例如:
void saveData() throws IOException {
FileWriter fw = new FileWriter("data.txt");
fw.write("hello");
fw.close();
}
// 调用处两种合法写法:
void doSave() {
try {
saveData(); // 捕获处理
} catch (IOException e) {
System.err.println("保存失败:" + e.getMessage());
}
}
void run() throws IOException { // 继续上抛
saveData(); // 编译器允许,因为 run 也声明了 throws
}
常见误区提醒
throws 不是 throw:前者是方法声明,后者是主动抛出异常实例(throw new IOException())。
-
throws出现在方法签名,只做承诺;throw出现在方法体,是实际动作 - 不能在
catch块里只写throws Exception——那是语法错误,想重新抛出要用throw e; - 即使方法体中没有显式 throw,只要调用了其他声明 throws 的方法,且没捕获,本方法也得声明 throws(或捕获)

















