# xp-robotaxi-itinerary-boot 代码问题分析 本文档记录了对该模块代码实现中发现的问题。 ## 问题列表 ### `XpPricingServiceImpl.java` **1. 线程泄漏风险** (line 128-169): ```java ThreadPoolExecutor executor = new ThreadPoolExecutor(..., (r) -> { Thread thread = new Thread(r); thread.setDaemon(false); // !!! 非守护线程 return thread; }); ``` - 自定义线程池使用了**非守护线程** (`thread.setDaemon(false)`) - 当应用上下文销毁时,`@PreDestroy` 虽然尝试关闭,但非守护线程会阻塞 JVM 退出 - JVM 无法退出直到所有非守护线程完成 - 应该使用守护线程 (`thread.setDaemon(true)`) 来允许 JVM 正常退出 **2. NPE 风险 - Check-then-get 竞态** (line 191-193): ```java if (redisService.hasKey(key)) { cache = Objects.requireNonNull(redisService.getCacheObject(key)); } ``` - 在 `hasKey` 检查和 `getCacheObject` 获取之间,key 可能被淘汰 - 如果 key 被淘汰,`getCacheObject` 返回 null,`Objects.requireNonNull` 会抛出 NPE - 应该先获取,然后再检查 null,而不是先检查存在再获取 **3. NPE 风险 - 缺少空检查**: - line 300-306: `systemSettingMapper.selectOne(null)` 可以返回 null,然后 `getMinOrderDistance()` 会抛出 NPE - line 450-451: `xpElectronicFenceAreaMapper.selectById()` 可以返回 null,然后 `getElectronicId()` 会抛出 NPE - line 460: `xpTradingStrategyMapper.selectOne(null)` 可以返回 null,然后 `getCancleCount()` 会抛出 NPE **4. 性能问题** (line 601): - 在循环中每次都通过 regex 分割字符串 - 最坏情况下每次队列条目都会重复解析和创建对象 - 可以预先解析或使用比缓存字符串键更好的数据结构 **5. 重复代码** (lines 631-636): - `xpRoutePlan` null 和非 null 两个分支几乎相同代码,只差别一个参数 - 可以抽取到一个方法避免重复