第一类:常见的运行时异常
这类异常通常是由于编码疏忽或逻辑不严谨造成的。
- 空指针异常
- 场景: 最经典的比如:调用
null对象的方法user.getName(),从 Map 中 get 一个不存在的键返回null后继续操作,或者自动拆箱Integer为int时对象为null。 - 原因与解决: 根本原因是缺少
null值判断。解决方法是:1)在调用前进行判空;2)使用Optional类来优雅地处理可能为null的情况;3) 在获取 Map 值时使用getOrDefault方法。
- 场景: 最经典的比如:调用
- 类型转换异常
- 场景: 在使用集合框架时,比如从一个声明为
List的集合里取出一个元素并强转为String,但实际上里面存放的是Integer。 - 原因与解决: 原因是类型不安全。解决方法是:1)在使用泛型集合时,始终指定具体的类型参数,利用编译器的类型检查;2)在强制转换前使用
instanceof进行类型判断。
- 场景: 在使用集合框架时,比如从一个声明为
- 数组越界/字符串越界异常
- 场景: 循环或访问数组、列表、字符串时,索引超出了有效范围。
- 原因与解决: 循环条件或索引计算错误。解决方法是在访问前检查索引是否
>=0且< array.length
第二类:业务相关的特定异常
这类异常与你的项目业务逻辑紧密相关,能体现你的业务理解能力。
- 场景: 比如在一个电商项目中,遇到过
InventoryShortageException。 - 原因: 用户下单时,系统检测到商品库存不足。
- 解决: 这不仅仅是一个技术异常,更是一个业务流程问题。不仅在代码中抛出这个异常,还在前端给用户明确的提示'商品库存不足',并引导用户重新选择。同时,这个异常会触发告警,通知运营人员及时补货。
第三类:框架和集成相关的异常
这类异常能体现你对所用技术栈的熟悉程度。
- Spring 框架中的异常:
BeanCreationException:比如 Bean 注入失败,可能是因为循环依赖。通过代码重构,使用@Lazy注解或 setter 注入来解决。TransactionException:事务回滚失败。检查了事务的传播属性和数据库连接,确保在异常发生时事务能正确回滚。
- 数据库相关异常:
DataIntegrityViolationException:插入数据违反了数据库约束(如唯一键冲突、外键约束)。通过在前端增加数据校验和在代码中先查询再插入的逻辑来避免。DeadlockLoserDataAccessException:数据库死锁。通过分析数据库死锁日志,调整业务逻辑中 SQL 的执行顺序,或者缩短事务执行时间来减少死锁概率。
- 网络和微服务异常:
ConnectException/SocketTimeoutException:在调用外部 HTTP 接口或微服务时,连接超时或读取超时。- 网络不稳定或下游服务响应慢。解决方案是:1)合理设置连接和读取超时时间;2)引入重试机制(如 Spring Retry);3)使用熔断器模式(如 Hystrix 或 Resilience4j)防止雪崩效应。


