0

0

在Java中如何区分Error与Exception使用场景_Java异常体系应用解析

P粉602998670

P粉602998670

发布时间:2026-01-22 13:53:17

|

616人浏览过

|

来源于php中文网

原创

该抛Error时仅限JVM无法恢复的严重问题(如OutOfMemoryError),业务异常必须用Exception;checked异常强制调用方处理,unchecked由程序员自主决定捕获。

在java中如何区分error与exception使用场景_java异常体系应用解析

什么时候该抛 Error,而不是 Exception

Error 表示 JVM 无法恢复的严重问题,比如 OutOfMemoryErrorStackOverflowErrorNoClassDefFoundError。这类错误不是程序逻辑能处理的,也不该被 catch——即使写了 catch (Error e),通常也只是记录日志后让进程退出。

常见误用:把自定义“系统不可用”类命名为 XXXError(如 DatabaseConnectionError),这违反语义。它本质是可预期、可重试、可降级的业务异常,应继承 Exception 或其子类。

  • 你不能也不应该 try-catch VirtualMachineError 子类
  • JVM 启动失败、类加载器崩溃、本地方法溢出——这些场景下程序已失去可控性
  • 框架或 SDK 内部遇到致命故障时,才可能主动 throw Error;业务代码中几乎从不 new 它

RuntimeException 和普通 Exception 怎么选

关键看是否强制调用方处理:Exception 及其子类(除 RuntimeException 外)是 **checked exception**,编译器强制你 try/catchthrows;而 RuntimeException 是 unchecked,由程序员自主决定是否捕获。

典型例子:NullPointerException 是 unchecked,因为它是编程疏漏,应在开发阶段修复;IOException 是 checked,因为文件读写、网络请求等外部依赖失败是常态,调用方必须明确策略(重试?返回默认值?转为用户提示?)。

立即学习Java免费学习笔记(深入)”;

Nanonets
Nanonets

基于AI的自学习OCR文档处理,自动捕获文档数据

下载
  • 输入校验失败(如参数为 null)→ 抛 IllegalArgumentExceptionRuntimeException
  • 数据库查询超时 → 抛 SQLException(checked),除非你封装成 DAO 层统一转为 unchecked
  • HTTP 调用返回 404 → 建议包装为业务相关的 unchecked 异常(如 UserNotFoundException),避免上层堆满 try-catch

自定义异常该继承哪个父类

不要一上来就继承 ExceptionRuntimeException。先问自己两个问题:调用方是否必须处理它?这个异常是否代表一种稳定的契约?

如果答案是“是”,且该异常在多数使用场景下都需要显式应对(例如支付扣款失败需触发退款流程),那就用 checked exception;否则,优先用 unchecked,并确保类名以 Exception 结尾(别用 Error)。

public class InsufficientBalanceException extends RuntimeException {
    public InsufficientBalanceException(String message) {
        super(message);
    }
}
  • 避免继承 Error 自定义异常——这是最常踩的命名陷阱
  • checked 异常一旦加入 public API,后续删除或改为 unchecked 会破坏二进制兼容性
  • Spring 等主流框架默认将未声明的异常(包括 unchecked)转为 500,但你可以用 @ExceptionHandler 统一映射,所以实际开发中 unchecked 更灵活

throwthrows 的边界容易模糊

throw 是动作,发生在方法体内;throws 是声明,写在方法签名后,只对 checked exception 有意义。对 RuntimeExceptionthrows 不报错,但属于冗余信息,多数 IDE 会警告。

一个具体坑:在 lambda 表达式里抛 checked exception 会编译失败,因为函数式接口方法签名没声明 throws。此时要么用 try-catch 包裹,要么借助包装工具类(如 ThrowingFunction),但更推荐重构为 unchecked。

  • 接口方法声明了 throws IOException,实现类可以抛更具体的 FileNotFoundException,但不能抛 SQLException
  • private 方法内部 throw Exception 没问题,但 public 方法若 throw checked exception,等于把处理责任强加给所有调用方
  • log.error("xxx", e) 后又 throw e,若 e 是 checked,必须在方法签名补 throws;若已 catch 过,再 throw 新异常,注意保留原异常链:throw new ServiceException("xxx", e)
实际项目里,异常体系混乱往往不是因为分不清 ErrorException,而是忽略了“谁该负责处理它”这个契约问题。越底层的模块(如数据访问层)越倾向抛 checked,越上层(如 Web 控制器)越倾向用统一异常处理器转为 JSON 错误响应——中间那层业务服务,才是最该谨慎设计异常类型的地方。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

160

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号