throw用于方法体内主动抛出异常对象,throws用于方法声明处声明可能抛出的异常类型;前者执行即中断流程,后者仅作编译期契约声明。
throw 和 throws 是 Java 异常处理中两个容易混淆但职责分明的关键字:前者是“动手抛”,后者是“提前打招呼”。用错位置或混用会导致编译失败或逻辑混乱,尤其在处理检查型异常(checked exception)时更需谨慎。
它出现在方法体里,后面必须跟一个真实的异常对象(new 出来的实例),执行到这一行就会立刻中断当前方法,把异常往上抛。
它写在方法声明末尾,不抛异常,只是告诉调用者:“我这个方法可能会冒出这些异常,你得自己看着办。”
throw 在花括号里,操作的是 异常实例;throws 在小括号后、大括号前,操作的是 异常类型。一个是“我出事了”,一个是“我可能出事”。
比如读取配置文件并校验内容:
public void loadConfig(String path) throws FileNotFoundException {
File file = new File(path);
if (!file.
exists()) {
throw new FileNotFoundException("配置文件不存在: " + path); // 主动抛出
}
// 后续读取逻辑...
}
这里 throws 告诉调用方“可能找不到文件”,而 throw 是真找不到时立即执行的动作。调用方必须处理 FileNotFoundException,否则编译不过。