throws用于声明方法可能抛出但不处理的受检异常,将责任转交调用者;必须用于未捕获的ioexception等checked exception,语法为“throws 异常类1, 异常类2”,子类重写时声明异常不得比父类更宽泛。

在 Java 中,throws 关键字用于**声明方法可能抛出但不处理的异常**,把异常责任交给调用者处理。它不真正“抛出”异常(那是 throw 干的事),而是告诉编译器:“我这个方法可能会出问题,调用我的人得准备好接住。”
什么时候必须用 throws?
当方法体内调用了可能抛出受检异常(checked exception)的代码,又不想用 try-catch 处理时,就必须在方法签名后加上 throws 声明。
- 常见受检异常:
IOException、SQLException、ClassNotFoundException - 非受检异常(
RuntimeException及其子类,如NullPointerException、ArrayIndexOutOfBoundsException)可选加throws,编译器不强制
throws 的基本写法
语法格式:
修饰符 返回类型 方法名(参数列表) throws 异常类1, 异常类2 { ... }
- 可以声明多个异常,用逗号分隔
- 异常类可以是具体类型(如
FileNotFoundException),也可以是父类(如Exception),但要符合继承关系 - 子类重写父类方法时,
throws声明的异常不能比父类更宽泛(即只能相同或更具体)
向上抛出的实际效果
使用 throws 后,异常会沿调用栈向上传递,直到被某层的 try-catch 捕获,或到达 main 方法。如果 main 也用 throws 声明且未捕获,程序终止并打印堆栈信息。
- 示例:读文件方法不处理
IOException,而是抛给调用者
void readFile(String path) throws IOException {
FileReader fr = new FileReader(path); // 可能抛出 IOException
// ... 读取逻辑
}
- 调用方必须处理:
✅try-catch捕获
✅ 或继续用throws往上抛(比如另一个业务方法也声明throws IOException)
常见误区提醒
-
throws是声明,throw是主动抛出一个异常对象(如throw new IllegalArgumentException("参数错误");) - 不能只写
throws Exception来偷懒——虽然语法合法,但掩盖了真实异常类型,降低可维护性 - 运行时异常(
RuntimeException)加throws不影响编译,但有助于文档化和 API 设计,让调用者知情
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











