throws用于声明方法可能抛出但不处理的受检异常,写在参数列表后、方法体前,多个异常用逗号分隔;仅受检异常必须声明,运行时异常声明无效且通常省略;子类重写时不能扩大异常范围;throws是责任转移,非异常处理。

Java 方法签名中用 throws 关键字声明该方法**可能抛出但不处理**的受检异常(checked exception),写在方法参数列表后、方法体前,多个异常用英文逗号分隔。
throws 的基本写法
语法格式为:
返回类型 方法名(参数列表) throws 异常类1, 异常类2 { ... }
例如:
public void readFile(String path) throws IOException { ... }-
public int divide(int a, int b) throws ArithmeticException { ... }(虽然 ArithmeticException 是运行时异常,也可声明,但编译器不强制)
只声明受检异常,运行时异常可选声明
受检异常(如 IOException、SQLException)必须被处理(try-catch)或声明(throws),否则编译失败。
非受检异常(即 RuntimeException 及其子类,如 NullPointerException、ArrayIndexOutOfBoundsException)无需声明,加了也不报错,但通常省略。
常见误区:把 throws RuntimeException 当作“让调用者处理空指针”是无效的——它不会改变编译行为,也不会提升代码健壮性。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
子类方法 throws 不能比父类更宽泛
重写方法时,子类声明的异常范围不能超过父类:
- 可以抛出父类 throws 中的某个异常(或其子类)
- 可以不 throws 任何异常
- 不能新增父类未声明的受检异常
throws IOException,子类可写 throws FileNotFoundException(它是 IOException 子类),但不能写 throws SQLException。throws 和 try-catch 的分工
throws 是“甩锅”,不是“解决”——它把异常责任转移给调用者。
真正处理逻辑(如重试、日志、友好提示)应在调用方用 try-catch 完成。
示例:
public void loadData() throws SQLException {
// 不在这里 catch,而是告诉上层:我可能出 SQL 错误
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
stmt.execute("SELECT * FROM users");
}调用处需应对:
try {
loadData();
} catch (SQLException e) {
logger.error("数据加载失败", e);
throw new ServiceException("用户数据不可用", e);
}

















