throws用于声明方法可能抛出但不处理的受检异常,强制调用者处理;必须用于未捕获的IOException等checked exception,不可用于RuntimeException;可声明多个异常,子类重写时不能扩大异常范围。

在 Java 中,throws 关键字用于在方法签名中声明该方法**可能抛出但不处理的受检异常(checked exception)**。它把异常的处理责任“推给”调用者,让上层代码决定是捕获(try-catch)还是继续向上声明。
什么时候必须用 throws?
当方法内部调用了可能抛出受检异常(如 IOException、SQLException、ClassNotFoundException 等)的代码,且你选择不在此方法中 try-catch 处理时,就必须在方法签名后加上 throws 异常类型。
- 编译器会强制检查:不声明也不捕获 → 编译失败
- 对运行时异常(
RuntimeException及其子类,如NullPointerException、ArrayIndexOutOfBoundsException)无需声明throws,加了也不报错,但通常不写
基本语法和写法
格式为:修饰符 返回类型 方法名(参数列表) throws 异常类1, 异常类2, ... { ... }
- 可以声明多个异常,用英文逗号分隔
- 异常类可以是具体类型(如
FileNotFoundException),也可以是其父类(如IOException),但应尽量精准 - 子类重写父类方法时,
throws声明的异常不能比父类更宽泛(即只能是父类声明异常的子类或相同类型)
示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
public void readFile(String path) throws FileNotFoundException, SecurityException {
FileReader fr = new FileReader(path); // 可能抛出 FileNotFoundException
// 其他可能触发 SecurityException 的操作
}
调用方必须响应 throws 声明
如果一个方法 A 声明了 throws XException,那么任何调用 A 的方法 B,都必须:
- 用
try-catch捕获并处理XException;或者 - 在自己的方法签名中也写
throws XException(或其父类),继续上抛
例如:
public void processFile() throws IOException {
readFile("data.txt"); // 调用方未捕获,所以自己也要 throws
}
或者:
public void processFile() {
try {
readFile("data.txt");
} catch (FileNotFoundException e) {
System.err.println("文件没找到:" + e.getMessage());
}
}
常见误区提醒
-
throws不等于“一定会抛出”,只是“有可能抛出且未处理” - 不要为了省事把所有异常都声明为
throws Exception—— 这会掩盖真实异常语义,降低可维护性 -
throws声明的是异常类型,不是异常对象;真正抛出要用throw new XxxException() - 一个方法可以有
throws,同时内部也有try-catch—— 比如捕获部分异常,再把其他异常上抛

















