news 2026/10/12 5:50:00

throw/throws 关键字

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
throw/throws 关键字

一、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 区别

  1. 运行时异常(RuntimeException 及其子类,如空指针、算术异常)方法上写 throws 可以省略,编译不报错,运行才会抛出。
  2. 受检异常(编译异常,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 有严格限制:

  1. 子类抛出的异常不能比父类更大;
  2. 可以抛出更少、更小的异常;
  3. 父类方法没有 throws,子类重写时不能抛出受检异常;

运行时异常不受这条限制。

六、throws 注意事项

  1. throws 只是声明可能性,不会主动产生异常;真正异常还是代码执行出错才产生;
  2. 仅仅声明 throws,不会自动捕获和修复 bug;
  3. 调用带有 throws 的方法,调用者二选一:
    • 继续往上 throws;
    • 使用 try-catch 捕获处理;
  4. 不要在 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 关键点

  1. throw 是主动抛出,代码执行到这里立刻抛出,后面代码不再执行;
  2. 抛出受检异常:必须配合 throws 声明或者内部 try-catch;
  3. 抛出运行时异常:不需要 throws 声明;
  4. throw 一次只能抛出一个异常对象;

六、throws 和 throw 对比表

关键字书写位置作用后跟内容数量
throws方法声明后面声明方法可能出现异常异常类名,逗号分隔多个多个
throw方法体内部主动抛出一个异常实例new 出来的异常对象只能 1 个

七、易错点

  1. throw 不要和 throws 混淆;
  2. throw 抛出异常后,本行之后代码不会执行;
  3. 业务校验场景大量使用 throw,自定义异常也会用到。

八、核心口诀

throw 写在方法内,手动抛出异常体; 一旦抛出就终止,后续代码不执行; 受检异常要声明,throws 配套写方法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 5:49:56

微网共享储能利益分配机制:调度权、收益分成与协议设计实战指南

做微网的人这几年大概率听过“共享储能”这个词。园区里建一块电池&#xff0c;几家企业一起用&#xff0c;投资有人分担&#xff0c;利用率也拉得起来&#xff0c;表面上是一个多方共赢的方案。但等到微网运营商和用户聚合商真正坐下来谈合作&#xff0c;事情就没那么舒服了。…

作者头像 李华
网站建设 2026/10/12 5:48:22

波士顿房价线性回归实战:从数据直觉到模型调优的完整代码顺序

1. 为什么我坚持用波士顿房价数据集练手线性回归很多人入门机器学习时&#xff0c;第一个接触的算法就是线性回归&#xff0c;第一个跑的数据集往往就是波士顿房价。这个组合几乎成了行业里的"Hello World"。但有意思的是&#xff0c;我见过太多人跑完一遍sklearn的L…

作者头像 李华
网站建设 2026/10/12 5:47:45

开源飞控ArduPilot备降点机制与源码实现解析

项目标题很直白&#xff0c;“开源飞控APM备降点源码分析”。你要是玩过多旋翼或者固定翼&#xff0c;肯定遇到过类似场景&#xff1a;电池电压警报响了&#xff0c;飞控自动切返航&#xff0c;结果返航点Home在你出发的地方&#xff0c;但你现在离它两公里远&#xff0c;一路顶…

作者头像 李华
网站建设 2026/10/12 5:46:30

真开源还是伪开源:从爆火团队看代码开放与社区参与的核心逻辑

这几年开源圈有个特别有意思的现象&#xff1a;隔一段时间就会冒出一个团队&#xff0c;因为“真开源”三个字被推到风口浪尖&#xff0c;GitHub 上一夜涨几千星&#xff0c;Issue 区挤满各国语言&#xff0c;连我所在的技术群里都在刷屏讨论。很多不太了解开源生态的朋友会问&…

作者头像 李华
网站建设 2026/10/12 5:45:18

AnyPS5串流方案全解析:从架构设计到延迟优化实战

1. 项目缘起与核心定位AnyPS5 这个标题第一次出现在我视野里的时候&#xff0c;我下意识地把它拆成了两个部分来看——“Any”和“PS5”。前者代表通用、跨平台、不受限&#xff0c;后者则指向一个非常具体的软硬件生态。把这两个词拼在一起&#xff0c;背后想表达的东西其实很…

作者头像 李华