throw用于主动抛出异常对象,必须是Throwable或其子类实例,语法为throw 异常对象;,会中断当前方法并向上抛出;若抛出受检异常,方法需用throws声明。

throw 用于在代码中主动抛出一个异常对象,它后面必须跟一个 Throwable 类型或其子类的实例(比如 Exception、RuntimeException 或自定义异常),不能是字符串、数字或其他类型。
throw 的基本用法
语法很简单:throw 异常对象;。这个语句会立即中断当前方法的执行,并把异常向上层调用者传递(除非被 try-catch 捕获)。
- 必须抛出的是异常对象,不是类名。例如要写
throw new IllegalArgumentException("参数不能为负");,而不是throw IllegalArgumentException; - 通常配合 if 判断使用,在业务逻辑不满足时提前终止并提示错误原因
- 如果方法内用了 throw 抛出的是 受检异常(checked exception),那么该方法声明必须加上
throws,否则编译不通过
throw 和 throws 的区别
throw 是“抛出一个异常实例”,发生在方法内部;throws 是“声明可能抛出的异常类型”,写在方法签名后,告诉调用者注意处理。
- throw 后面是对象(
new XxxException()),throws 后面是类名(throws IOException) - 一个方法里可以有多个 throw,但最多只有一个 throws(可声明多个异常,用逗号分隔)
- throw 用于具体触发异常动作,throws 是一种契约式声明
常见使用场景举例
比如校验用户年龄不能为负数:
立即学习“Java免费学习笔记(深入)”;
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
this.age = age;
}
再比如手动抛出运行时异常(无需 throws 声明):
throw new NullPointerException("用户名不能为空");throw new UnsupportedOperationException("该操作暂未实现");
如果是 IO 相关检查,抛出受检异常则需声明:
public void readFile(String path) throws FileNotFoundException {
if (path == null || path.trim().isEmpty()) {
throw new FileNotFoundException("文件路径不能为空");
}
// ... 实际读取逻辑
}
注意事项
别把 throw 当成日志打印或流程控制来用。过度使用异常会影响性能,也违背异常设计初衷——异常应表示“非正常情况”,不是常规分支逻辑。
- 不要用 throw 替代 if-else 判断正常业务走向
- 自定义异常建议继承 RuntimeException(运行时异常),避免强制调用方处理
- 异常信息尽量清晰具体,方便排查问题,避免笼统写 "error occurred"










