在Java里throwable类和exception类有什么区别_Java异常类层级解析

秋静君_7084

秋静君_7084

2026-02-06

835人浏览

原创

Throwable 是异常体系根类,Exception 是其专用于可预期、可恢复问题的子类;应优先捕获 Exception 而非 Throwable,自定义异常须继承 Exception 或 RuntimeException,禁直接继承 Throwable。

在java里throwable类和exception类有什么区别_java异常类层级解析

Throwable 是异常体系的根,Exception 是它的一个子类

Java 所有能被 throw 或 catch 的对象,必须是 Throwable 或其子类的实例。它本身不能直接 new(构造器是 protected),但它的两个直接子类可以:Error 和 Exception。而 Exception 就是专为“程序可预期、可恢复”的问题设计的——比如文件找不到、网络超时、空指针访问等。

换句话说:Throwable 是“所有异常和错误”的统称;Exception 是其中“你该管、也能管”的那一部分。

catch (Throwable e) 会捕获 Error,这通常是个坏主意

写 catch (Throwable e) 看似“兜底”,实际风险很大:

  • 它会把 OutOfMemoryError、StackOverflowError 这类 JVM 已经快崩了的严重错误也吞掉,导致程序继续跑在不可靠状态里
  • 你几乎无法对 Error 做有意义的恢复(比如重试、降级、日志补救),强行 catch 反而掩盖了真正的问题
  • 绝大多数业务代码应该只用 catch (Exception e),它天然过滤掉 Error,专注处理你能 handle 的异常

例外场景极少:比如你在写一个通用监控代理、JVM 启动引导器,或者明确要记录并上报所有崩溃信号——才考虑捕获 Throwable,且之后应立即退出或重启。

Exception 分两类:编译器强制你管的(Checked),和不强制但常出错的(Unchecked)

Exception 下又分两支:

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • IOException、SQLException 这类是 Checked Exception:方法签名里必须 throws,或用 try-catch 包住,否则编译失败
  • NullPointerException、IllegalArgumentException 这些属于 RuntimeException(Exception 的子类),是 Unchecked Exception:编译器不管,但运行时一出就中断线程

关键区别不在“能不能 catch”,而在于设计意图:Checked 表示“这个异常大概率会发生,你得提前想好怎么应对”;Unchecked 表示“这是代码逻辑缺陷,应该修复,而不是靠 try-catch 掩盖”。

别继承 Throwable 写自定义异常,优先继承 Exception 或 RuntimeException

自己定义异常类时:

  • 如果希望调用方必须处理(比如支付接口返回“余额不足”,业务层必须做提示或跳转),就继承 Exception
  • 如果是参数校验失败、状态非法等“不该发生却发生了”的逻辑错误,就继承 RuntimeException(如 IllegalArgumentException)
  • 绝对不要直接继承 Throwable —— 这等于把自己写的异常和 OutOfMemoryError 放到同一层级,语义混乱,还可能被误捕获成系统级错误

一个容易忽略的细节:自定义异常类名最好以 Exception 结尾(如 InsufficientBalanceException),这是 Java 社区约定,IDE 和静态检查工具都依赖这个命名识别异常类型。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1029

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3200

5

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

379

31

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3188

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5149

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3849

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

486

15

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4498

6

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

2025.11.16

179

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习