throw是抛出异常的动作,每次执行只触发一次且必须配合Throwable实例;throws是方法声明中对可能抛出异常的承诺,用于告知调用者需处理受检异常。

throw 是抛出动作,发生在方法内部
它代表一次具体的异常触发行为,必须配合异常对象使用。比如参数校验失败时,你写 throw new IllegalArgumentException("用户名不能为空"),JVM 就会立刻中断当前执行流,把控制权交给最近的 catch 或向上层传递。
- 只能抛出一个异常对象,每次执行只触发一次
- 后面必须是 Throwable 的实例(不能是类名),通常用 new ExceptionType(...) 构造
- 可以出现在任何代码块中——if 分支、循环里、甚至单独一行
- 对运行时异常(如 NullPointerException)可不声明;但对受检异常(如 IOException),若没 try-catch,就必须由所在方法用 throws 声明
throws 是异常承诺,写在方法签名上
它不抛异常,只是告诉调用者:“我这个方法可能会冒出哪些异常,你得负责处理”。比如 public String readFile() throws IOException, SQLException,相当于一份免责预告。
- 位置固定:紧跟在参数列表后、方法体前
- 后面跟的是异常类名,可以多个,用逗号分隔
- 不创建对象,也不执行任何逻辑,纯编译期检查用
- 主要约束受检异常;运行时异常加不加 throws 都合法,加了也无强制处理要求
两者常配合使用
典型场景是:方法内部用 throw 抛出受检异常,同时在方法声明处用 throws 告知调用方。例如读文件时遇到 IO 问题,先 throw new IOException("文件不存在"),再在方法头上写 throws IOException。这样既表达了错误,又明确了责任边界。
- 没有 throws,throw 出的受检异常会导致编译失败
- 有 throws 却没 throw,编译器不报错——声明只是可能性,不是必然性
- try-catch 可替代 throws 处理受检异常,二者是二选一关系
记法小技巧
从单词本身联想:throw 是“扔出去”(动词,动作),throws 是“可能扔”(第三人称单数,预告)。语法上,“throw + 对象”,“throws + 类型”,就像“吃苹果”和“爱吃水果”——前者已发生,后者表倾向。
立即学习“Java免费学习笔记(深入)”;


















