throws用于方法签名中声明可能抛出但不处理的受检异常,如ioexception、sqlexception;必须在调用可能抛出受检异常且未用try-catch处理时使用,可声明多个异常并用逗号分隔,子类重写时不能扩大异常范围。

在 Java 中,throws 关键字用于在方法签名中声明该方法**可能抛出但不处理**的受检异常(checked exception),告诉调用者:“我可能会出问题,你得负责处理它”。注意:它不处理异常,只是“甩锅”给上层调用方。
什么时候必须用 throws?
当方法内部调用了可能抛出 受检异常(如 IOException、SQLException)的代码,而你又不想在当前方法里用 try-catch 捕获处理时,就必须在方法签名后加上 throws 异常类名。
- 不受检异常(
RuntimeException及其子类,如NullPointerException、ArrayIndexOutOfBoundsException)可以不声明,加了也不报错,但通常不写 - 一个方法可以声明多个异常,用逗号分隔:
throws IOException, SQLException - 子类重写父类方法时,
throws的异常类型不能比父类更宽(只能相同或更具体)
基本写法示例
比如读取文件内容的方法:
public void readFile(String path) throws IOException {
FileReader fr = new FileReader(path); // 可能抛出 IOException
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
br.close();
}
这里没写 try-catch,而是把 IOException 推给调用者。那么调用它的代码就必须处理:
- 用
try-catch捕获:try { readFile("a.txt"); } catch (IOException e) { ... } - 或者继续往上
throws,直到某个地方真正处理它
常见误区提醒
throws 不等于 throw:
throws 在方法签名上,是“声明”;throw 在方法体内,是“主动抛出一个异常对象”。
- 不能只写
throws Exception来偷懒(虽然语法允许),应尽量精确声明实际可能抛出的具体异常类型 - 如果方法里既有受检异常又有运行时异常,
throws只需写受检的;运行时异常写了也行,但无强制意义 - 构造方法也可以用
throws,例如:public MyClass() throws IOException { ... }










