【Java 开发日记】运行时有出现过什么异常?

【Java 开发日记】运行时有出现过什么异常?

目录

第一类:常见的运行时异常

第二类:业务相关的特定异常

第三类:框架和集成相关的异常

需要避免的坑

总结


在我的项目开发和生产运维中,遇到的异常可以归纳为以下几类:

第一类:常见的运行时异常

这类异常通常是由于编码疏忽或逻辑不严谨造成的。

  • 空指针异常
    • 场景: 最经典的比如:调用 null 对象的方user.getName(), 从Map中get一个不存在的键返回null后继续操作,或者自动拆箱Integerint时对象为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,然后加了判空”。要深入一点,讲讲场景和思考。
  • 不要抱怨: 不要把问题归咎于同事或过时的代码,要展示你主动解决问题的能力。

总结

面试官问这个问题,不仅仅是想听你列举异常名称,他更想考察你的实战经验、问题分析能力和解决复杂问题的思路。用一个结构化的回答,并结合一个深入的故事,会让你在这个问题上获得高分。

如果小假的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!

Read more

GraphQL在Python中的完整实现:从基础到企业级实战

GraphQL在Python中的完整实现:从基础到企业级实战

目录 摘要 1 引言:为什么GraphQL是API设计的未来 1.1 GraphQL的核心价值定位 1.2 GraphQL技术演进路线图 2 GraphQL核心技术原理深度解析 2.1 Schema定义语言与类型系统 2.1.1 Schema定义原则 2.1.2 类型系统架构 2.2 Resolver解析机制深度解析 2.2.1 Resolver执行模型 2.2.2 Resolver执行流程 2.3 Strawberry vs Graphene框架深度对比 2.3.1 架构设计哲学对比 2.3.2 框架选择决策树 3 实战部分:

By Ne0inhk
Python 3.12 logging - 12 - makeLogRecord

Python 3.12 logging - 12 - makeLogRecord

Python 3.12 logging 的 makeLogRecord 引言 在 Python 的 logging 模块中,makeLogRecord 是一个用于从字典重建日志记录的函数。它将一个包含日志事件属性的字典转换为一个 LogRecord 对象,从而可以在本地日志系统中重新处理该事件。这在分布式日志收集、日志回放或测试等场景中非常有用。 函数签名 logging.makeLogRecord(attrs:dict)-> logging.LogRecord * 参数 attrs:一个字典,包含要创建的 LogRecord 的所有属性。常见的属性包括 name、levelno、pathname、lineno、msg、args、exc_info 等,也可以是自定义字段。 * 返回值:一个新的 LogRecord 实例,

By Ne0inhk
C++11新特性(上)----《Hello C++ Wrold!》(25)--(C/C++)

C++11新特性(上)----《Hello C++ Wrold!》(25)--(C/C++)

文章目录 * 前言 * 历史知识 * 统一的列表初始化 * initializer\_list * 声明 * STL里面的一些变化 * 新容器 * 新接口 * 新的类功能 * 左值引用和右值引用 * 左值和右值 * 左值引用和右值引用 * 移动构造 * 完美转发 * 万能引用 * 完美转发 前言 C++ 作为一门经典且持续演进的编程语言,其标准迭代始终围绕 “提升开发效率、优化性能、完善语言特性” 展开。1998 年首个国际标准 C++98 奠定了语言基础,而 2011 年发布的 C++11 标准则堪称一次里程碑式的更新 —— 它不仅修复了早期版本的诸多缺陷,更引入了大量革命性特性,从根本上改变了 C++ 的编程范式,为开发者提供了更简洁、高效且安全的编码工具。 本文将聚焦 C++11 标准的核心新增特性,从 “统一列表初始化”

By Ne0inhk

游戏开发者必看:Visual C++运行库部署实战

快速体验 1. 打开 InsCode(快马)平台 https://www.inscode.net 2. 输入框内输入如下内容: 创建一个游戏安装包集成工具,功能:1.分析游戏exe依赖的VC++运行库版本 2.自动下载对应版本的合并模块(merge module) 3.生成包含运行库的安装程序 4.提供静默安装选项 5.支持从2005到2022所有VC++版本。使用Inno Setup脚本实现,集成VC_redist.exe自动检测逻辑。 1. 点击'项目生成'按钮,等待项目生成完整后预览效果 游戏开发中经常遇到玩家反馈"缺少dll"的问题,十有八九都是Visual C++运行库没装对。今天就分享一个实战经验:如何把VC+

By Ne0inhk