一、throws 作用
throws写在方法声明处,用于声明该方法有可能抛出某种异常,把异常交给调用这个方法的人去处理。
一句话区分:throws 是声明异常,自己不捕获,抛给上层调用者。 和 try-catch 的区别:try-catch 是当场捕获处理;throws 是甩锅,交给调用方处理。
二、语法格式
修饰符 返回值 方法名(参数列表) throws 异常类名1,异常类名2...{ // 方法体 }- 多个异常,逗号隔开;
- 写的是异常类名。
三、代码示例
public class ThrowsDemo { // 在方法上声明:本方法可能抛出算术异常 public static void test() throws ArithmeticException { int a = 10; int b = 0; int res = a / b; // 发生异常,不在这里捕获,抛给调用者 } public static void main(String[] args) { // 方式1:main方法继续throws,异常交给JVM(不推荐,程序直接崩溃) // public static void main(String[] args) throws ArithmeticException // 方式2:调用处用try-catch捕获,推荐 try { test(); } catch (ArithmeticException e) { System.out.println("捕获到test方法抛出来的除零异常"); } } }四、受检异常(编译期异常)和运行时异常 throws 区别
- 运行时异常(RuntimeException 及其子类,如空指针、算术异常)方法上写 throws 可以省略,编译不报错,运行才会抛出。
- 受检异常(编译异常,IOException 等)代码必须处理:要么 try-catch 捕获,要么方法上加 throws 声明,否则编译直接报错。
示例:受检异常必须 throws 或者捕获
import java.io.FileReader; import java.io.IOException; public class ThrowsCheckedDemo { // IOException是受检异常,必须声明throws或者内部try-catch public static void readFile() throws IOException { FileReader fr = new FileReader("test.txt"); } public static void main(String[] args) { try { readFile(); } catch (IOException e) { e.printStackTrace(); } } }五、方法重写时 throws 规则(重点)
子类重写父类方法时,throws 有严格限制:
- 子类抛出的异常不能比父类更大;
- 可以抛出更少、更小的异常;
- 父类方法没有 throws,子类重写时不能抛出受检异常;
运行时异常不受这条限制。
六、throws 注意事项
- throws 只是声明可能性,不会主动产生异常;真正异常还是代码执行出错才产生;
- 仅仅声明 throws,不会自动捕获和修复 bug;
- 调用带有 throws 的方法,调用者二选一:
- 继续往上 throws;
- 使用 try-catch 捕获处理;
- 不要在 main 方法滥用 throws,会让异常直接交给 JVM,程序直接终止。
七、throws 与 throw 前置对比(下一节学 throw)
- throws:方法声明上,声明可能抛出异常,后跟异常类,可多个;
- throw:方法体内,手动创建并抛出异常对象,后跟异常对象,一次只能抛一个。
八、核心口诀
throws 写在方法头,声明异常往外丢; 调用方要做选择,要么捕获要么丢; 编译异常强制管,运行异常随便留; 子类重写有约束,异常不能放大流。
Java 学习笔记:throw 关键字
一、throw 作用
throw在方法内部,手动创建一个异常对象,主动抛出这个异常。
适用场景:业务逻辑不符合预期,手动抛出异常,比如传入参数非法。
二、语法格式
throw new 异常类名("异常提示信息");throw 后面必须是异常对象;一次只能抛出 1 个异常。
三、代码示例
public class ThrowDemo { public static void checkAge(int age) { if(age < 0 || age > 120){ // 手动创建异常对象并抛出 throw new RuntimeException("年龄不合法!必须在0~120之间"); } System.out.println("年龄校验通过"); } public static void main(String[] args) { try { checkAge(-10); } catch (RuntimeException e) { System.out.println("捕获异常:" + e.getMessage()); } } }四、throw + throws 组合使用
手动 throw 受检异常,方法上必须用 throws 声明,否则编译报错:
public class ThrowThrowsDemo { public static void test() throws Exception { throw new Exception("手动抛出编译期异常"); } public static void main(String[] args) { try { test(); } catch (Exception e) { e.printStackTrace(); } } }五、throw 关键点
- throw 是主动抛出,代码执行到这里立刻抛出,后面代码不再执行;
- 抛出受检异常:必须配合 throws 声明或者内部 try-catch;
- 抛出运行时异常:不需要 throws 声明;
- throw 一次只能抛出一个异常对象;
六、throws 和 throw 对比表
| 关键字 | 书写位置 | 作用 | 后跟内容 | 数量 |
|---|---|---|---|---|
| throws | 方法声明后面 | 声明方法可能出现异常 | 异常类名,逗号分隔多个 | 多个 |
| throw | 方法体内部 | 主动抛出一个异常实例 | new 出来的异常对象 | 只能 1 个 |
七、易错点
- throw 不要和 throws 混淆;
- throw 抛出异常后,本行之后代码不会执行;
- 业务校验场景大量使用 throw,自定义异常也会用到。
八、核心口诀
throw 写在方法内,手动抛出异常体; 一旦抛出就终止,后续代码不执行; 受检异常要声明,throws 配套写方法。