异常的处理

1. NullPointerException(空指针异常 NPE)

是什么 对象是 null,你却调用它的方法 / 属性。

出现场景

  • 对象没初始化
  • 方法返回 null,你直接用
  • 集合、对象里的属性是 null
  • 拆箱时:Integer a = null; int b = a;

典型报错

java 复制代码
Cannot invoke "String.trim()" because "str" is null

详细解决

  1. 调用前非空判断
java 复制代码
if (user != null) { ... }
  • 使用 Objects.nonNull() / Objects.requireNonNull()
  • 使用 Optiona
java 复制代码
Optional.ofNullable(user).map(User::getName).orElse("")

方法尽量不返回 null,返回空集合 / 空串

  • 入参统一校验

2. IOException(IO 异常)

是什么 所有输入输出错误,文件、网络、流操作失败。

出现场景

  • 文件不存在、权限不足
  • 文件被占用、流没关闭
  • 网络断开、超时、连接被重置
  • 序列化失败

常见子类

  • FileNotFoundException
  • SocketException
  • SocketTimeoutException
  • Connection reset / Broken pipe

典型报错

java 复制代码
java.io.IOException: Connection reset by peer
java.io.FileNotFoundException: xxx.txt (权限不够)

详细解决

  1. 文件:检查路径、权限、是否被占用
  2. 流必须关闭:优先 try-with-resources
  3. 网络 IO 必须设置超时
  4. 网络失败加重试机制
  5. 日志打印详细信息:路径、参数、堆栈

3. RuntimeException(运行时异常)

是什么 程序运行时才抛出,不需要强制 try-catch

最常见 4 种子类

  1. NullPointerException(空指针)
  2. ArrayIndexOutOfBoundsException 数组越界
  3. IndexOutOfBoundsException 集合越界
  4. ClassCastException 类型强转失败
  5. IllegalArgumentException 非法参数
  6. ArithmeticException 除零异常

出现场景

  • 循环越界
  • 强转不相关对象
  • 参数传错
  • 除 0

典型报错

java 复制代码
java.lang.ClassCastException: ...
java.lang.IndexOutOfBoundsException: ...

详细解决

  1. 循环 / 访问前判断大小
  2. 不随便强转,用 instanceof
  3. 入参校验
  4. 除数判断不能为 0

4. SQLException(数据库异常)

是什么数据库操作失败。

出现场景

  • SQL 语法错误
  • 字段不存在、类型不匹配
  • 主键重复、唯一键冲突
  • 连接超时、锁等待超时
  • 事务失败

典型报错

java 复制代码
Duplicate entry 'xxx' for key 'PRIMARY'
Unknown column 'xxx' in 'field list'
Lock wait timeout exceeded

详细解决

  1. 检查 SQL、MyBatis 映射
  2. 检查参数类型、长度
  3. 唯一键冲突:先查后插 / 用唯一索引
  4. 慢查询加索引
  5. 调整连接池、事务超时

5. TimeoutException / 接口超时

是什么调用外部服务 / DB/Redis 超过时间没返回。

出现场景

  • 对方服务卡死、慢查询
  • 网络拥堵
  • 线程池满、队列满
  • 死锁、长事务

典型表现

  • 接口一直转圈
  • 网关 504
  • 日志:read timeout /connect timeout

详细解决

  1. 所有远程调用必须设超时
  2. 接口限流、熔断、降级
  3. 检查对方服务是否正常
  4. 检查自己线程池、连接池是否打满
  5. 异步 / 异步编排优化

6. OutOfMemoryError(OOM 内存溢出)

是什么堆内存不够用了。

出现场景

  • 一次性查全表数据
  • 死循环创建对象
  • 静态集合一直加对象(内存泄漏)
  • 线程泄漏、连接未释放
  • 大文件、大对象

典型报错

java 复制代码
java.lang.OutOfMemoryError: Java heap space

详细解决

  1. 分页查询,不一次性 load 全部数据
  2. 检查 static 集合、缓存是否无限增长
  3. 检查线程、连接、流是否关闭
  4. 调整 JVM 参数:-Xms -Xmx
  5. 使用 MAT、Arthas 排查泄漏

7. 并发常见异常(你后面必会)

ConcurrentModificationException

场景 :遍历集合时修改(add/remove)解决:用迭代器、并发集合、加锁

Blocked / 死锁

场景 :锁嵌套、顺序不一致解决:统一加锁顺序、超时、避免锁嵌套

相关推荐
m0_531237171 小时前
C语言-函数练习
c语言·开发语言
~央千澈~1 小时前
抖音弹幕游戏开发之第16集:异常处理与稳定性·优雅草云桧·卓伊凡
开发语言·php
亓才孓1 小时前
【MyBatis Exception】省略动态SQL中的‘‘,会造成Runtime Exception
java·服务器·mybatis
清水白石0081 小时前
解锁 Python 性能潜能:从基础精要到 `__getattr__` 模块级懒加载的进阶实战
服务器·开发语言·python
坚持就完事了1 小时前
数据结构之堆(Java\Python双语实现)
java·数据结构·算法
暴力袋鼠哥1 小时前
基于 SpringBoot + Vue3 的社区医院管理系统实战(含 AI 问诊 + 电子病历 PDF 导出
java·spring boot·intellij-idea·mybatis
马尔代夫哈哈哈1 小时前
Spring 事务处理
java·后端·spring
清水白石0081 小时前
缓存的艺术:Python 高性能编程中的策略选择与全景实战
开发语言·数据库·python
Andy Dennis1 小时前
各种单例模式的实现方式
java·单例模式