1. NullPointerException(空指针异常 NPE)
是什么 对象是 null,你却调用它的方法 / 属性。
出现场景
- 对象没初始化
- 方法返回
null,你直接用 - 集合、对象里的属性是
null - 拆箱时:
Integer a = null; int b = a;
典型报错
java
Cannot invoke "String.trim()" because "str" is null
详细解决
- 调用前非空判断
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 (权限不够)
详细解决
- 文件:检查路径、权限、是否被占用
- 流必须关闭:优先
try-with-resources - 网络 IO 必须设置超时
- 网络失败加重试机制
- 日志打印详细信息:路径、参数、堆栈
3. RuntimeException(运行时异常)
是什么 程序运行时才抛出,不需要强制 try-catch。
最常见 4 种子类
- NullPointerException(空指针)
- ArrayIndexOutOfBoundsException 数组越界
- IndexOutOfBoundsException 集合越界
- ClassCastException 类型强转失败
- IllegalArgumentException 非法参数
- ArithmeticException 除零异常
出现场景
- 循环越界
- 强转不相关对象
- 参数传错
- 除 0
典型报错
java
java.lang.ClassCastException: ...
java.lang.IndexOutOfBoundsException: ...
详细解决
- 循环 / 访问前判断大小
- 不随便强转,用
instanceof - 入参校验
- 除数判断不能为 0
4. SQLException(数据库异常)
是什么数据库操作失败。
出现场景
- SQL 语法错误
- 字段不存在、类型不匹配
- 主键重复、唯一键冲突
- 连接超时、锁等待超时
- 事务失败
典型报错
java
Duplicate entry 'xxx' for key 'PRIMARY'
Unknown column 'xxx' in 'field list'
Lock wait timeout exceeded
详细解决
- 检查 SQL、MyBatis 映射
- 检查参数类型、长度
- 唯一键冲突:先查后插 / 用唯一索引
- 慢查询加索引
- 调整连接池、事务超时
5. TimeoutException / 接口超时
是什么调用外部服务 / DB/Redis 超过时间没返回。
出现场景
- 对方服务卡死、慢查询
- 网络拥堵
- 线程池满、队列满
- 死锁、长事务
典型表现
- 接口一直转圈
- 网关 504
- 日志:read timeout /connect timeout
详细解决
- 所有远程调用必须设超时
- 接口限流、熔断、降级
- 检查对方服务是否正常
- 检查自己线程池、连接池是否打满
- 异步 / 异步编排优化
6. OutOfMemoryError(OOM 内存溢出)
是什么堆内存不够用了。
出现场景
- 一次性查全表数据
- 死循环创建对象
- 静态集合一直加对象(内存泄漏)
- 线程泄漏、连接未释放
- 大文件、大对象
典型报错
java
java.lang.OutOfMemoryError: Java heap space
详细解决
- 分页查询,不一次性 load 全部数据
- 检查 static 集合、缓存是否无限增长
- 检查线程、连接、流是否关闭
- 调整 JVM 参数:-Xms -Xmx
- 使用 MAT、Arthas 排查泄漏
7. 并发常见异常(你后面必会)
ConcurrentModificationException
场景 :遍历集合时修改(add/remove)解决:用迭代器、并发集合、加锁
Blocked / 死锁
场景 :锁嵌套、顺序不一致解决:统一加锁顺序、超时、避免锁嵌套