throw关键字用于主动抛出一个已实例化的Throwable异常对象,中断当前流程交由上层处理;必须写成throw new ExceptionType("msg")形式,不可直接写类名,常用于参数校验和业务规则校验。

在 Java 中,throw 关键字用于**主动抛出一个异常对象**,让程序在特定条件下中断正常流程,交由上层(调用者)处理。它不创建异常,而是“扔出”一个已经实例化的异常对象。
throw 的基本写法
语法很简单:
- throw 后面必须跟一个异常类的实例(即已 new 出来的 Throwable 或其子类对象)
- 不能直接写类名,比如
throw IllegalArgumentException;是错的 - 通常配合 if 判断使用,在业务逻辑不满足时提前终止
示例:
public static void checkAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄必须在 0 到 150 之间");
}
System.out.println("年龄合法:" + age);
}
throw 和 throws 的区别
初学者容易混淆这两个关键字:
立即学习“Java免费学习笔记(深入)”;
- throw:语句级操作,在方法内部“抛出一个异常实例”
- throws:声明级操作,写在方法签名后,表示“这个方法可能抛出哪些异常类型”,是给调用者看的契约
二者常一起出现:
public static void readFile(String path) throws IOException {
if (path == null) {
throw new IllegalArgumentException("路径不能为空");
}
// 可能触发 IOException,由 throws 声明
Files.readAllBytes(Paths.get(path));
}
可以 throw 哪些异常?
只要继承自 Throwable 就能 throw,但有约定俗成的用法:
-
运行时异常(RuntimeException 及其子类):如
IllegalArgumentException、NullPointerException,无需强制 try-catch 或 throws -
检查型异常(Exception 及其非 RuntimeException 子类):如
IOException、SQLException,必须被处理(捕获或声明 throws) -
错误(Error)一般不 throw:如
OutOfMemoryError,属于 JVM 严重问题,不建议手动抛出
throw 的典型使用场景
不是所有错误都要 throw,关键是“当前方法无法继续执行且调用方应感知并决策”:
- 参数校验失败(如空值、非法范围、格式错误)
- 业务规则被违反(如余额不足、重复提交、权限不足)
- 外部依赖不可用时包装异常(如把 HTTP 异常转为自定义 ServiceException)
- 占位或 TODO 逻辑中临时抛出
new UnsupportedOperationException()


















