异常的处理

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

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

相关推荐
学长毕设8 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h8 小时前
c++ string
开发语言·c++
raindayinrain9 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的9 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao9 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
zzu123zsw10 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
学逆向的10 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的10 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”10 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号10 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统