在Java中受检异常和非受检异常有什么区别_Java异常分类说明-java教程

受检异常继承Exception但不属RuntimeException体系,编译器强制处理;非受检异常继承RuntimeException或Error,编译器不强制。

怎么一眼判断一个异常是受检还是非受检

看它继承谁:RuntimeException 或 Error 的子类 → 非受检;其他 Exception 子类(且不属 RuntimeException 体系)→ 受检。比如 IOException 继承 Exception,没碰 RuntimeException,编译器就拦你;而 NullPointerException 是 RuntimeException 的直系后代,写完直接能编译通过。

为什么编译器只强制处理受检异常

这不是 JVM 的硬性要求,而是 Java 语言层面的设计约定——编译器(javac)在语法检查阶段主动介入,对非 RuntimeException/非 Error 的 Exception 子类做“必须处理”校验。JVM 运行时其实根本不区分这两类,字节码里抛异常的指令都一样。

  • 你漏处理 SQLException?javac 报错:unreported exception SQLException; must be caught or declared to be thrown
  • 你漏处理 IllegalArgumentException?编译器沉默,运行到那儿才崩
  • 这个机制本质是“提醒你:这事外部可能出问题,别假装看不见”

实际写代码时最容易踩的坑

把受检异常塞进 lambda、Stream 或 CompletableFuture 里,结果编译不过——因为这些 API 的函数式接口(如 Function、Supplier)方法签名没声明抛出受检异常。

  • 错误写法:list.stream().map(s -> new FileInputStream(s)) → FileInputStream 构造会抛 FileNotFoundException(受检),但 Function 不允许
  • 正确解法:要么用工具类包装成非受检异常(如 throw new RuntimeException(e)),要么改用支持受检异常的第三方接口(如 ThrowingFunction)
  • 更隐蔽的坑:在 Spring 的 @Transactional 方法里吞掉受检异常却不抛出,事务可能不会按预期回滚(因为 Spring 默认只对 RuntimeException 和 Error 回滚)

自定义异常该选哪一类

取决于调用方有没有能力/责任去恢复它:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java中受检异常和非受检异常有什么区别_Java异常分类说明-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001689+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001689+
  • 本周更新: 0+
  • 最后更新: 2026-03-16