递归遍历对象树查找指定元素时始终返回null问题求助
问题分析与修复方案
问题根源
你的代码存在两个核心问题,导致无论是否找到目标元素都返回null:
- 循环覆盖结果:遍历子节点时,每次递归调用的结果都会直接覆盖
treeItemfound。哪怕前面的子递归已经找到目标节点,后面的子节点递归返回null时,会把之前的有效结果彻底覆盖。 - 逻辑顺序倒置:检查当前节点是否匹配的代码放在了遍历子节点之后,即便当前节点是目标,也会先遍历所有子节点,而循环的覆盖问题已经让可能存在的有效结果丢失。
修复后的代码
public static TreeItem<Category> getTreeItem2(TreeItem<Category> treeItem, Integer itemId) { // 先检查当前节点是否匹配,匹配直接返回 if (treeItem.getValue().getCat_Ident().equals(itemId)) { System.out.println(treeItem + " ***treeItem found***"); System.out.println("==================================================="); return treeItem; } ObservableList<TreeItem<Category>> currentTreeList = treeItem.getChildren(); for (TreeItem<Category> child : currentTreeList) { TreeItem<Category> found = getTreeItem2(child, itemId); // 找到目标节点后立即返回,不再遍历剩余子节点 if (found != null) { return found; } } // 所有子节点遍历完毕仍未找到,返回null return null; }
修复说明
- 提前校验当前节点:先判断当前节点是否为目标,避免不必要的子节点遍历,提升查找效率。
- 终止无效遍历:遍历子节点时,只要递归返回非null(找到目标)就立刻返回结果,彻底避免后续子节点覆盖有效结果的问题。
- 安全的引用类型比较:
Integer是引用类型,用==比较可能在超出-128到127缓存范围时出现错误,改用equals更可靠。
内容的提问来源于stack exchange,提问作者foschi
相关产品推荐
相关产品推荐

