throw用于主动抛出异常对象,需为Throwable实例,后语句不执行;常配合if校验使用,与throws声明异常类型不同,后者用于方法签名。

在 Java 中,throw 关键字用于在代码中**主动抛出一个异常对象**,常用于检测到非法状态、参数错误或业务规则不满足时,提前中断执行并交由上层处理。
throw 的基本用法
语法很简单:throw 异常对象;。注意:必须是 Throwable 或其子类(如 Exception、RuntimeException)的实例。
- 不能直接 throw 类名,必须是已创建的对象,例如
throw new IllegalArgumentException("年龄不能为负数"); - throw 后面的语句不会执行(类似 return),所在方法必须声明抛出该异常(检查型异常),或确保被 try-catch 包裹
- 常见写法是配合 if 判断使用,比如校验入参
throw 和 throws 的区别
throw 是“抛出一个异常实例”,发生在方法内部;throws 是“声明可能抛出的异常类型”,写在方法签名后,告诉调用者要留意。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 例如:
public void divide(int a, int b) throws ArithmeticException—— 这里 throws 是声明,实际抛出还得靠throw new ArithmeticException()或底层触发 - 如果是
RuntimeException及其子类(如NullPointerException),可不写 throws,因为它们是运行时异常,编译器不强制处理
典型使用场景示例
比如定义一个设置用户年龄的方法,要求年龄必须在 0–150 之间:
立即学习“Java免费学习笔记(深入)”;
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄必须在 0 到 150 之间");
}
this.age = age;
}
- 这里抛出的是检查型异常(
IllegalArgumentException实际是运行时异常,所以无需 throws 声明) - 若换成
IOException这类检查型异常,则方法签名必须加throws IOException - 也可以复用已有异常,比如
throw ex;(重新抛出捕获到的异常)
注意事项
throw 不是万能的“报错提示”,它本质是控制流转移机制。
- 避免无意义地 throw new Exception(),应选择语义明确的子类
- 异常消息尽量具体,便于排查(如包含变量值、上下文)
- 不要用 throw 替代正常逻辑分支(比如用抛异常来实现条件跳转),这会降低可读性和性能

















