throws用于声明方法可能抛出但不处理的受检异常;必须在未捕获ioexception等受检异常时使用,可声明多个异常,重写时不得扩大异常范围,区别于throw语句。

在 Java 中,throws 关键字用于在方法签名中声明该方法**可能抛出但不处理的受检异常(checked exception)**。它不是用来“抛出”异常,而是告诉调用者:“我这个方法可能会出问题,你得负责处理。”
什么时候必须用 throws
只有当方法体内出现了受检异常(比如 IOException、SQLException),而你又没用 try-catch 捕获它时,编译器强制要求你在方法签名后加上 throws 异常类名。
- 非受检异常(如
NullPointerException、IllegalArgumentException)不用声明,写了也不报错,但通常没必要 - 一个方法可以声明抛出多个异常,用逗号分隔:
throws IOException, SQLException - 子类重写父类方法时,不能抛出比父类更宽泛的受检异常(即只能相同或更具体的异常类型)
基本写法和常见例子
比如读取文件内容的方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public String readFile(String path) throws IOException {
FileReader reader = new FileReader(path);
BufferedReader br = new BufferedReader(reader);
return br.readLine();
}
这里 FileReader 构造器和 readLine() 都可能抛出 IOException,而方法里没捕获,就必须用 throws 声明。
- 调用方要么继续向上抛(加
throws),要么用try-catch处理 - 如果调用这个方法却不处理也不声明,编译直接失败
和 throw 的区别要分清
throw 是语句,用于**主动抛出一个异常对象**;throws 是修饰符,用于**声明方法可能产生的异常类型**。
-
throw new IllegalArgumentException("参数非法");—— 真的扔出去了 -
public void doSomething() throws IllegalArgumentException—— 只是预告“可能扔”,实际未必发生 - 一个方法可以有多个
throw,但throws只出现在方法签名末尾一次
实际使用中的建议
合理使用 throws 能让异常传播路径清晰,避免隐藏错误。
- 不要为了编译通过而盲目加
throws Exception,应具体到真正可能发生的异常类型 - 业务方法尽量封装底层异常,比如把
IOException包装成自定义的FileLoadException再抛出,提高可读性 - 接口方法声明
throws时,实现类必须遵守契约,不能擅自扩大异常范围
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










