阿里后端开发面经04
- 时间
- 2025-09
- 来源
- 牛客网
《面试题目》
- Java 异常体系的继承结构是怎样的?
- 日常开发中应如何处理异常?有哪些基本原则?
- 设计服务接口时,应如何划分异常类型并制定处理方式?
- Throwable 体系中的 Error 通常在什么情况下产生?
- HashMap 和 TreeMap 有什么区别?
- HashMap 的 key 为 null 时如何处理?哈希值是如何计算的?
- ConcurrentHashMap 能存储 null 吗?为什么?
- ConcurrentHashMap 和 Hashtable 有什么区别?
- HashMap 的线程不安全体现在哪里?多线程操作时可能出现什么情况?
- 你使用过哪些分布式框架?
- 你使用过哪些消息队列?Kafka 的工作流程是怎样的?
- 如何保证消息不被重复消费?
- 哪些情况会导致消息重复消费?
《参考解析》
1. Java 异常体系:Throwable 分为 Error 和 Exception。Error 通常表示 JVM 或运行环境的严重问题;Exception 又分为需要显式处理的受检异常和 RuntimeException 体系的非受检异常。业务代码应在能够恢复、补偿或补充上下文的边界处理异常。
2. 接口异常设计:区分参数错误、认证授权、资源状态、业务冲突和系统故障,映射为稳定的错误码与 HTTP 状态。日志中保留完整异常和请求标识,对用户只返回必要信息;无法恢复的异常继续向上抛出,避免吞错。
3. ConcurrentHashMap 禁止 null:并发读取中,返回 null 需要明确表示 key 不存在;若允许 null value,就无法在一次无锁读取中区分“不存在”和“值为 null”。Hashtable 同样不允许 null,但主要依靠方法级 synchronized,ConcurrentHashMap 的并发粒度和扩展性更好。
4. Kafka 重复消费:消费者处理完成但提交位点前崩溃、重平衡或提交失败,都可能让消息再次投递。业务侧应使用唯一事件 ID、数据库唯一约束或幂等状态表保证重复执行无副作用,并合理协调业务提交与位点提交的顺序。