throws 是 Java 中用于在方法声明处预告可能抛出检查型异常的关键字,它不处理异常而是将处理责任移交调用者;必须声明继承自 Exception 但非 RuntimeException 的异常,如 IOException、SQLException;而 throw 是在方法体内实际抛出异常对象的语句。

throws 是 Java 中用于在方法声明处“预告”该方法可能抛出检查型异常(checked exceptions)的关键字。它不处理异常,而是把异常的处理责任明确交给调用者——相当于签了一份“异常处理合同”。
throws 的核心作用:声明而非处理
它出现在方法签名末尾,语法为:
返回类型 方法名(参数) throws 异常类1, 异常类2 { ... }
比如:
public void loadConfig() throws IOException, SQLException-
public User findById(int id) throws UserNotFoundException(自定义异常)
一旦这样声明,编译器就会强制要求:任何调用这个方法的代码,必须用 try-catch 捕获这些异常,或者在其自身方法上继续用 throws 声明。这是 Java 对检查型异常的强制约束机制。
哪些异常必须用 throws 声明?
只有检查型异常(checked exceptions)需要显式声明,即继承自 Exception 但不继承自 RuntimeException 的类。常见例子包括:
-
IOException(文件、网络操作) -
SQLException(数据库访问) ClassNotFoundException- 你自己定义的继承自
Exception的异常类
而 RuntimeException 及其子类(如 NullPointerException、IllegalArgumentException)属于非检查型异常,编译器不强制声明,可选加 throws,但通常不写。
立即学习“Java免费学习笔记(深入)”;
throws 和 throw 的关键区别
容易混淆,但角色完全不同:
-
throw 是动词,出现在方法体内部,用来实际抛出一个异常对象,例如:
if (age - throws 是形容词性说明,出现在方法签名上,用来声明本方法可能抛出哪些异常类型,不抛出具体对象,也不执行动作。
一句话记牢:throw 是“扔”,throws 是“说‘我可能会扔’”。一个动手,一个预告。
使用 throws 的实用建议
不是所有地方都适合加 throws,合理使用才能让代码清晰健壮:
- 只声明真正可能抛出的检查型异常,避免写
throws Exception这种宽泛声明 - 私有方法尽量自行处理异常(比如记录日志+重试),不盲目向上抛
- 公共 API 方法应准确声明异常,并在 Javadoc 中说明每种异常的触发条件
- 配合 try-with-resources 使用,确保资源(如文件流)即使抛异常也能自动关闭
- 在分层架构中,DAO 层常 throws 异常,Service 层决定是捕获转换,还是继续 throws 给 Controller 层统一响应










