throw用于主动抛出异常实例,需传入Throwable或其子类对象,不可为null或类名;检查型异常须声明throws或捕获,非检查型异常则无此限制。

在 Java 中,throw 关键字用于在代码中**主动抛出一个异常对象**,通常用于检测到非法状态、业务规则不满足或需要提前终止执行流程时。它不是定义异常类型,而是“扔出”一个已创建的异常实例。
throw 的基本语法和要求
使用 throw 时必须紧跟一个**异常类的实例**(即已经 new 出来的 Throwable 或其子类对象),不能是类名或 null。
- 语法:
throw new RuntimeException("提示信息"); - 只能抛出 Throwable 类型或其子类(如 Exception、RuntimeException、Error)的实例
- 抛出检查型异常(checked exception)时,所在方法必须用 throws 声明,或用 try-catch 捕获
- 抛出非检查型异常(unchecked exception,如 RuntimeException 及其子类)则无此强制要求
常见使用场景与示例
实际开发中,throw 常用于参数校验、状态判断、业务拦截等。
- 参数校验:比如方法不允许传入 null 或负数
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
this.age = age;
}
- 业务规则拦截:如用户未登录时禁止操作
public void deleteOrder(String userId) {
if (userId == null || userId.trim().isEmpty()) {
throw new SecurityException("用户未登录,禁止删除订单");
}
// 执行删除逻辑
}
throw 和 throws 的区别
初学者容易混淆这两个关键字:
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- throw 是语句,出现在方法体内部,表示“抛出一个异常实例”
- throws 是方法声明的一部分,写在方法签名后,表示“该方法可能抛出哪些异常类型”,是给调用方的契约提示
例如:
public void readFile(String path) throws IOException {
if (path == null) {
throw new NullPointerException("文件路径不能为空");
}
// 可能触发 IOException 的读取操作
}
这里 throw 抛出的是运行时异常(无需声明),而 throws IOException 是因为底层 read 操作本身会抛出检查型异常。
自定义异常配合 throw 使用
为了更准确表达业务含义,常定义自己的异常类,再用 throw 抛出:
public class InsufficientBalanceException extends Exception {
public InsufficientBalanceException(String msg) {
super(msg);
}
}
// 使用
public void withdraw(double amount) throws InsufficientBalanceException {
if (amount > balance) {
throw new InsufficientBalanceException("余额不足,无法提款:" + amount);
}
balance -= amount;
}
这样调用方能清晰识别业务异常,并决定是否捕获处理。

















