throw用于手动抛出异常实例,必须是throwable或其子类对象;throws用于声明方法可能抛出的受检异常,写在方法签名后,两者协同实现分层异常处理。

在 Java 中,throw 关键字用于手动抛出一个异常对象,让程序主动中断当前流程,并将控制权交给最近的匹配 catch 块或向上传播。它不创建异常,而是“扔出”一个已创建好的异常实例。
throw 的基本用法
throw 后面必须跟一个 Throwable 类型(或其子类)的对象,不能是类名或字符串。常见写法是配合 new 创建异常对象:
throw new IllegalArgumentException("参数不能为负数");throw new NullPointerException("用户名不能为空");throw new MyCustomException("自定义业务错误");
注意:抛出的异常类型需与方法声明的 throws 列表兼容(对于受检异常),否则编译不通过。
throw 和 throws 的区别
throw 是语句,表示“此刻抛出一个异常”;throws 是方法声明的一部分,表示“这个方法可能抛出哪些异常”。两者常配合使用:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 如果抛出的是 受检异常(如
IOException、SQLException),方法签名必须用throws声明,否则编译失败 - 如果抛出的是 非受检异常(如
RuntimeException及其子类),throws不是必需的,但可加来提示调用方
在业务逻辑中合理使用 throw
手动抛异常不是为了替代正常返回,而是表达“非法状态”或“无法继续执行”的语义。典型场景包括:
- 参数校验失败:如传入 null、负数、空字符串等不符合约定的值
- 业务规则被违反:如余额不足时尝试扣款、重复提交订单等
- 外部依赖不可用时提前失败:如配置缺失、必要服务未启动
建议用语义明确的异常类型(如 IllegalArgumentException、IllegalStateException),并附带清晰的错误消息,便于排查和日志记录。
throw 不能单独存在,必须在可执行语句上下文中
throw 是一条完整的语句,必须出现在方法体、静态块、构造器等可执行代码中,不能写在类级别或字段声明处:
- ✅ 正确:
if (id - ❌ 错误:
public class UserService { throw new RuntimeException(); }(编译报错)
另外,throw 后的代码不会执行(除非被 finally 拦截),所以通常放在条件判断末尾或逻辑分支中。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










