java异常与日志思维导图主线为“谁抛、谁捕、谁记、谁管”:中心是error(不处理)与exception;exception分runtimeexception(预防为主)和受检异常(必须处理);常用try-catch-finally及推荐的try-with-resources;日志需在catch中记录完整堆栈,推荐slf4j+logback;自定义异常要见名知意并保留异常链。

画Java异常与日志的思维导图,关键不是堆砌所有概念,而是抓住主线逻辑和高频实践点。重点突出“谁抛、谁捕、谁记、谁管”,结构清晰、层级合理,才能真正辅助理解与复习。
异常体系分层:Error vs Exception
这是整个异常知识的根基,必须放在中心位置第一级分支。
- Error:JVM级致命问题,比如OutOfMemoryError、StackOverflowError,程序不该捕获,更不能恢复——导图里用灰色或虚线标注“不处理”
-
Exception再分两支:
- RuntimeException(非受检):空指针、数组越界、类型转换异常等,编译器不强制处理,但90%是代码缺陷,应靠预防(如判null、校验索引)而非依赖catch
- 其他Exception(受检):比如IOException、SQLException,编译器强制你声明或捕获,代表外部不确定性(文件不存在、网络中断),必须显式应对
异常处理机制:try-catch-finally 与 try-with-resources
聚焦实际编码中最常写的结构,避免理论空谈。
-
try-catch 基本写法:强调多catch顺序——子类在前、父类在后;避免用
catch(Exception e)这种宽泛捕获 - finally 的真实作用:不是“总会执行”就万事大吉,要说明它在return之前执行、但不改变return值;同时提醒:别在finally里throw新异常,否则会吞掉原始异常
-
try-with-resources(推荐):只适用于实现了
AutoCloseable的资源(如FileInputStream、Connection),语法简洁且自动关闭,比手动finally更安全可靠
日志集成:异常 + 日志 = 可追溯性
异常本身不落地,等于没发生;日志不带异常上下文,等于白记。
- 记录时机:在catch块中打日志,而不是在方法入口无差别打印
- 记录内容:至少包含异常类型、消息、完整堆栈(e.printStackTrace()不够,要用logger.error("msg", e))
- 日志框架选型提示:SLF4J + Logback 是当前主流组合,避免直接使用Log4j1(已停更)或System.out
- 补充技巧:对敏感信息(如密码、token)做脱敏处理后再入日志,防止泄露
进阶要点:自定义异常与异常链
面向真实项目场景,不是为了炫技,而是提升可维护性。
- 自定义异常命名要见名知意,比如
UserNotFoundException、InsufficientBalanceException,继承RuntimeException或Exception依需而定 - 抛出自定义异常时,用
new BizException("余额不足", e)把原始异常作为cause传入,保留调用链,方便排查根因 - 不要为每个if都抛异常——异常成本高,仅用于“意外情况”,正常业务分支用if-else或状态码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











