【Java 开发日记】运行时有出现过什么异常?
目录
第一类:常见的运行时异常
第二类:业务相关的特定异常
第三类:框架和集成相关的异常
需要避免的坑
总结
在我的项目开发和生产运维中,遇到的异常可以归纳为以下几类:
第一类:常见的运行时异常
这类异常通常是由于编码疏忽或逻辑不严谨造成的。
- 空指针异常
-
- 场景: 最经典的比如:调用
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)防止雪崩效应。
需要避免的坑
- 不要说“我没遇到过什么异常”: 这会显得你经验不足。
- 不要只停留在表面: 不要只说“我遇到了NPE,然后加了判空”。要深入一点,讲讲场景和思考。
- 不要抱怨: 不要把问题归咎于同事或过时的代码,要展示你主动解决问题的能力。
总结
面试官问这个问题,不仅仅是想听你列举异常名称,他更想考察你的实战经验、问题分析能力和解决复杂问题的思路。用一个结构化的回答,并结合一个深入的故事,会让你在这个问题上获得高分。
如果小假的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

