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

在 Java 中,throws 关键字用于声明一个方法可能抛出但不处理的异常,把异常责任交给调用者处理。它不解决异常,只是“甩锅”给上层——让编译器知道:“这个方法可能会出问题,你调用它时得自己兜着。”
什么时候必须用 throws?
当方法体内出现了受检异常(checked exception)(如 IOException、SQLException),而你又不想在当前方法里用 try-catch 捕获处理,就必须用 throws 声明,否则编译不通过。
- 非受检异常(unchecked),比如
NullPointerException、ArrayIndexOutOfBoundsException,可以不声明,加了也不报错,但通常没必要 - 构造方法、普通方法、静态方法都可以使用
throws - 一个方法可声明多个异常,用逗号分隔
基本语法和写法
在方法签名末尾添加 throws 异常类名,支持单个或多个:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
void readFile() throws IOException { ... }
void process() throws IOException, SQLException { ... }
如果父类方法声明了 throws,子类重写时:
- 不能抛出比父类更宽泛的受检异常(比如父类 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(或捕获)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










