throw用于主动抛出异常对象,立即中断当前方法执行并交由调用栈处理;必须后跟Throwable实例,checked异常需声明throws,unchecked异常无需声明。

在 Java 中,throw 关键字用于主动抛出一个异常对象,一旦执行到 throw 语句,当前方法的执行立即中断,控制权交给调用栈中最近的匹配 catch 块或向上继续传播。
throw 的基本用法和语法要求
throw 后必须跟一个 Throwable 类型(或其子类)的实例,不能是类名或字符串。常见写法包括:
- 抛出已存在的异常对象:
throw new IllegalArgumentException("参数不能为 null"); - 复抛捕获的异常:
catch (IOException e) { throw e; }(注意:这会保留原始栈轨迹) - 包装异常再抛出:
throw new RuntimeException("业务校验失败", originalException);
编译器会检查是否符合异常处理规则:若抛出的是 checked exception(如 IOException),则所在方法必须声明 throws,否则编译报错;而 RuntimeException 及其子类(unchecked)可直接 throw,无需声明。
在条件不满足时主动中断流程
这是 throw 最典型的用途——替代 if-return 或提前退出,让错误语义更清晰、更易被上层统一处理。
立即学习“Java免费学习笔记(深入)”;
- 比如校验入参:
if (userId - 比如状态非法:
if (!order.isPending()) throw new IllegalStateException("只能取消待支付订单"); - 避免后续逻辑执行:throw 之后的代码不会运行,不需要额外 return 或 else 分支。
与 throws 的配合使用
throw 是“抛出动作”,throws 是“声明承诺”。当方法内使用 throw 抛出 checked 异常时,必须在方法签名中用 throws 声明,否则编译失败。
- 正确示例:
public void readFile(String path) throws IOException { if (path == null) throw new IOException("路径为空"); ... } - 错误示例:抛出
SQLException却没声明 throws → 编译报错 - 注意:即使方法内部 throw 的是 unchecked 异常,也可以选择性加 throws 声明,便于调用方了解可能风险(非强制)。
常见误区提醒
容易踩的坑包括:
- throw null → 运行时报
NullPointerException(因为 throw 要求非 null 的 Throwable 实例) - 把异常类名当对象用:
throw IllegalArgumentException;→ 编译错误 - 在 finally 块中 throw → 可能掩盖 try/catch 中已抛出的异常(慎用)
- 过度使用 throw new Exception(...) → 推荐使用语义明确的子类,如
IllegalStateException、IllegalArgumentException


















