异常的处理

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

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

相关推荐
晚枫歌F3 分钟前
btree B树实现key-value存储
开发语言·数据结构
foundbug9995 分钟前
多智能体三维编队飞行控制MATLAB实现
开发语言·matlab
炸膛坦客8 分钟前
单片机/C语言八股:(七)C 程序运行时内存布局的动态变化
c语言·开发语言
吴声子夜歌9 分钟前
小程序——界面API(一)
java·javascript·小程序
予枫的编程笔记13 分钟前
【面试专栏|Java并发编程】从Runnable到Callable,Java4种线程创建方式
java·多线程·thread·java面试·runnable·callable·java线程
野犬寒鸦16 分钟前
SAP后端实习开发面试:操作系统与网络核心考点及Linux与Redis
java·服务器·网络·后端·面试
ServBay18 分钟前
代码减半,10分钟彻底告别 Java 开发旧习
java·后端
MegaDataFlowers28 分钟前
CRUD操作及配置解析
java·mybatis
毕设源码-邱学长34 分钟前
【开题答辩全过程】以 胡小楼行政村农用灌溉机井预约管理系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
JTCC37 分钟前
Java 设计模式西游篇 - 第五回:装饰者模式添法力 悟空披挂新战袍
java·观察者模式·设计模式