异常的处理

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 / 死锁

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

相关推荐
Amumu121386 小时前
Js:正则表达式(一)
开发语言·javascript·正则表达式
无人机9017 小时前
Delphi 网络编程实战:TIdTCPClient 与 TIdTCPServer 类深度解析
java·开发语言·前端
TeDi TIVE7 小时前
Spring Cloud Gateway
java
froginwe117 小时前
CSS 图像拼合技术
开发语言
计算机安禾8 小时前
【数据结构与算法】第22篇:线索二叉树(Threaded Binary Tree)
c语言·开发语言·数据结构·学习·算法·链表·visual studio code
:mnong8 小时前
Superpowers 项目设计分析
java·c语言·c++·python·c#·php·skills
a里啊里啊8 小时前
测试开发面试题
开发语言·chrome·python·xpath
豆沙糕8 小时前
Python异步编程从入门到实战:结合RAG流式回答全解析
开发语言·python·面试
信奥胡老师8 小时前
P1255 数楼梯
开发语言·数据结构·c++·学习·算法
A.A呐8 小时前
【C++第二十一章】set与map封装
开发语言·c++