当前位置: 首页 > news >正文

Java 异常体系全解析

        异常,不只是 try-catch

        在 Java 世界里,异常(Exception)是程序运行时处理“非预期状态”的核心机制。如何定义错误边界?如何传递失败信息?如何保证系统在异常路径下依然健壮?

一、Java 异常体系全景图

Java 中所有“可抛出”的类型都继承自 java.lang.Throwable,其派生出两个核心子类:

Throwable
├── Error             // JVM 或系统级严重错误,程序通常无法恢复
└── Exception         // 应用级异常,程序可捕获并处理├── RuntimeException  // 运行时异常,编译器不强制处理└── 其他 Exception     // 受检异常(Checked Exception),必须显式处理
  • Error:留给 JVM,表示“系统崩了”,如 OutOfMemoryErrorStackOverflowError
  • Exception:留给开发者,表示“逻辑出错了”,如 IOExceptionSQLException
  • RuntimeException:表示“编程错误”,如 NullPointerExceptionArrayIndexOutOfBoundsException

二、Error:你不该捕获的“系统级灾难”

常见 Error 类型:

  1. OutOfMemoryError:堆/元空间/直接内存溢出
  2. StackOverflowError:递归过深或栈帧过大
  3. NoClassDefFoundError:类加载失败
  4. LinkageError:类版本冲突、方法签名不一致

为什么不建议捕获 Error

        例如捕获 OOM 后继续运行,可能导致数据错乱、连接泄漏、状态不一致 —— 比直接崩溃更危险!

三、Exception:受检 vs 非受检,设计的权衡

1. 受检异常(Checked Exception)

特点:编译器强制要求处理(try-catch 或 throws)

代表IOExceptionSQLExceptionClassNotFoundException

public void readFile(String path) throws IOException {FileReader reader = new FileReader(path); // 编译器强制你处理 IOException// ...
}

2. 非受检异常(Unchecked Exception / RuntimeException)

特点:编译器不强制处理,通常表示“编程错误”

代表:NullPointerExceptionIllegalArgumentExceptionIndexOutOfBoundsException

public void process(String input) {if (input == null) {throw new IllegalArgumentException(" "); // 主动抛出,语义清晰}// ...
}

四、try-catch-finally 执行机制深度解析

1. 基本执行顺序

public static int test() {int x = 1;try {System.out.println("try");return ++x;           // 计算返回值(x=2),暂存} catch (Exception e) {System.out.println("catch");} finally {System.out.println("finally");x = 3;                // 修改 x,但不影响已暂存的返回值}return x;                 // 这行不会执行
}
// 输出:
// try
// finally
// 返回值:2

核心机制

  1. return 表达式先计算,结果暂存
  2. finally 块无论如何都会执行(除 System.exit() 或 JVM 崩溃)
  3. finally 中的 return 会覆盖 try/catch 中的返回值

2. finally 中 return 的陷阱

public static int badExample() {try {return 1;} finally {return 2; // 覆盖了 try 的返回值,破坏逻辑,难以调试}
}

finally 只用于资源释放、状态清理、日志记录

绝不在 finally 中 return、throw、break、continue

五、Spring 中的全局异常处理:@ControllerAdvice

在 Web 应用中,我们通常在 Controller 层统一处理异常,避免每个方法写 try-catch。

1. 全局异常处理器示例

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {@ExceptionHandler(BusinessException.class)public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException e) {log.warn("业务异常: {}", e.getMessage(), e);return ResponseEntity.badRequest().body(new ErrorResponse(e.getCode(), e.getMessage()));}@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleUnexpectedException(Exception e) {log.error("系统异常", e);return ResponseEntity.status(500).body(new ErrorResponse("SYSTEM_ERROR", "系统繁忙,请稍后再试"));}
}

2. 错误响应体设计

public record ErrorResponse(String code, String message) {}

优势

  • 统一错误格式,前端可标准化处理
  • 避免异常堆栈暴露给用户(安全)
  • 日志集中记录,便于监控与排查


文章转载自:

http://4ypCy5Hi.nzLqt.cn
http://LSEXNvwQ.nzLqt.cn
http://YjgiRhii.nzLqt.cn
http://j1JJoqwJ.nzLqt.cn
http://ORAlcqyn.nzLqt.cn
http://hnac9ihr.nzLqt.cn
http://CRSnFE23.nzLqt.cn
http://DxCUrwvp.nzLqt.cn
http://4G4Z6r8c.nzLqt.cn
http://5uz24Q2P.nzLqt.cn
http://hmO35CzV.nzLqt.cn
http://l2KYGF1o.nzLqt.cn
http://xS6gJyB2.nzLqt.cn
http://GhLXnVAc.nzLqt.cn
http://WlWFV9Mx.nzLqt.cn
http://xpMQAzUc.nzLqt.cn
http://7Z7FVw2H.nzLqt.cn
http://nIccTQnh.nzLqt.cn
http://gFoni1LB.nzLqt.cn
http://Eh6ARREq.nzLqt.cn
http://tazwuvpv.nzLqt.cn
http://T5wqqoyO.nzLqt.cn
http://LN22JyIT.nzLqt.cn
http://LeGDNMBF.nzLqt.cn
http://Y2CHIVJf.nzLqt.cn
http://mI6jo9i9.nzLqt.cn
http://ezbtxNl0.nzLqt.cn
http://7lJukHjY.nzLqt.cn
http://CeBwg2XY.nzLqt.cn
http://TnlbNqtW.nzLqt.cn
http://www.dtcms.com/a/379487.html

相关文章:

  • Linux 系统资源负载控制脚本:CPU 内存一键管理(后台常驻版)
  • rook-ceph登录报错Invalid credentials
  • 《RocketMQ核心架构与实战解析》
  • C语言---常量
  • 豆包・图像创作模型 Seedream 4.0 正式发布!
  • OCSP(Online Certificate Status Protocol,在线证书状态协议)
  • 深度学习(六):代价函数的意义
  • 【lite.ai.toolkit】【深度学习】【Ubuntu 20.04】C++ 轻量级AI模型工具箱的编译、安装、使用教程
  • 远程创意协作新方式:cpolar助力Drawnix跨地域团队协作
  • 深入理解 Linux 内核进程管理
  • 企业跨区域组网新解:SD-WAN技术打造安全稳定网络体系
  • 单身杯2 web
  • 《Learning Langchain》阅读笔记12-RAG(8):RAG的优化策略
  • daily notes[43]
  • LRU缓存详解:用C语言实现高效数据管理
  • 灵码产品演示:软件工程架构分析
  • 硬件电路-陀机
  • swiper插件的使用
  • mysql的各种锁
  • Java大厂面试实录:AIGC与虚拟互动场景下的微服务与AI落地(附知识详解)
  • Kafka 学习笔记
  • 机械零件极限应力线图
  • 萤石安全生产监管解决方案:构建企业安全智能化防护网
  • sqlmap常用命令
  • MID认证:全球电力计量市场的通行证与中国协议兼容性分析
  • STM32开发(USART:IIC总线)
  • Spring框架中用到的设计模式
  • 从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)
  • 四、计算机网络与分布式系统(中)
  • 半导体学习笔记