在Java中异常也是对象吗_Java异常体系结构解析
发布时间 - 2026-02-03 00:00:00 点击率:次是的,Java中所有异常都是Throwable的实例。它们是运行时堆上的对象,可被创建、传递、捕获、检查和序列化;只有继承Throwable的类才能被throw或catch;Exception和Error是其直接子类,自定义异常必须继承其中之一。
是的,Java 中所有异常都是 Throwable 的实例,也就是实实在在的对象——它们可以被创建、传递、捕获、检查,甚至序列化。
为什么说异常是对象?从 throw 和 catch 看本质
Java 规定:只有继承自 Throwable 的类才能被 throw;而 catch 捕获的也必然是 Throwable 或其子类的引用。这说明异常不是语法标记或状态码,而是运行时堆上的对象。
常见误操作:
- 试图
throw null—— 会抛出NullPoi(因为 JVM 要求必须是
nterException
Throwable实例) - 写
catch (Exception e)却以为捕获的是“错误类型”,其实捕获的是一个指向堆中异常对象的引用 - 在
catch块里修改e.getMessage()并不改变原异常对象(除非是可变字段,但标准异常类基本不可变)
Exception 和 Error 都是 Throwable 的直接子类
Java 异常体系顶端是 Throwable,它有两个直接子类:
-
Exception:程序本应捕获或声明的异常,比如IOException、SQLException -
Error:JVM 无法恢复的严重问题,如OutOfMemoryError、StackOverflowError,通常不应被捕获(捕获了也难以处理)
注意:RuntimeException 是 Exception 的子类,但它属于“未检查异常”(unchecked),编译器不强制要求 try-catch 或 throws;而 IOException 这类“检查异常”(checked)必须显式处理。
自定义异常必须继承 Throwable 或其子类
不能凭空写个类就 throw,否则编译失败。正确方式是继承 Exception(检查异常)或 RuntimeException(未检查异常):
public class InsufficientBalanceException extends RuntimeException {
public InsufficientBalanceException(String message) {
super(message);
}
}
关键点:
- 继承
RuntimeException→ 调用方无需try-catch或throws - 继承
Exception→ 编译器强制调用方处理,适合业务上必须响应的异常(如文件不存在) - 所有异常类默认都有无参构造和
String构造,建议至少提供这两种构造方法 - 不要重写
fillInStackTrace()除非有特殊性能需求(它开销较大)
真正容易被忽略的,是异常对象的生命周期和内存行为:每次 new XXXException() 都会在堆上分配对象,频繁抛异常(尤其在循环里)会显著影响性能;另外,异常的栈轨迹(printStackTrace() 输出的内容)是在构造时通过 fillInStackTrace() 收集的,这个过程本身就有开销。
# java
# 栈
# 状态码
# java异常
# overflow
# 为什么
# jvm
# String
# NULL
# 子类
# try
# throw
# catch
# Error
# 循环
# 继承
# 堆
# 对象
# 都是
# 的是
# 自定义
# 或其
# 是在
# 序列化
# 就有
# 会在
# 这类
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何处理文件下载请求?(Response示例)
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
如何在阿里云ECS服务器部署织梦CMS网站?
简单实现Android验证码
bootstrap日历插件datetimepicker使用方法
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
制作旅游网站html,怎样注册旅游网站?
Linux系统命令中tree命令详解
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何解决hover在ie6中的兼容性问题
南京网站制作费用,南京远驱官方网站?
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Mybatis 中的insertOrUpdate操作
Laravel如何发送系统通知?(Notification渠道示例)
如何用美橙互联一键搭建多站合一网站?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何快速搭建高效香港服务器网站?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
linux top下的 minerd 木马清除方法
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Laravel Fortify是什么,和Jetstream有什么关系
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何快速重置建站主机并恢复默认配置?
lovemo网页版地址 lovemo官网手机登录
详解Huffman编码算法之Java实现
做企业网站制作流程,企业网站制作基本流程有哪些?
图册素材网站设计制作软件,图册的导出方式有几种?
php json中文编码为null的解决办法
jQuery 常见小例汇总
如何快速搭建高效WAP手机网站?
如何快速配置高效服务器建站软件?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
如何用花生壳三步快速搭建专属网站?


