如何在含递归的循环中返回对象?解决返回null问题
问题分析与修复
核心问题
- 递归返回值未传递:你在
forEach里调用递归,但没有接收或返回子递归的结果。就算子递归找到了目标对象,上层方法也无法获取到,最终还是返回null。 - 冗余的do-while循环:代码里的
do-while循环完全没必要,flag初始为false,循环只会执行一次,对逻辑没有任何帮助。 - 未处理无限嵌套(循环引用):如果子Budget列表中存在对父Budget的引用,会导致无限递归,最终栈溢出。
修复后的代码
private static Budget recursion(Budget budget, long sec, Set<Budget> visited) { // 检查当前节点是否已访问,防止循环引用导致无限递归 if (visited.contains(budget)) { return null; } visited.add(budget); // 匹配到目标直接返回 if (Objects.equals(budget.getSection(), sec)) { return budget; } // 遍历子Budget,递归查找,找到结果立即返回 for (Budget subBudget : budget.getSubBudget()) { Budget found = recursion(subBudget, sec, visited); if (found != null) { return found; } } return null; } // 对外调用的入口方法,初始化已访问集合 private static Budget findBudget(Budget root, long sec) { return recursion(root, sec, new HashSet<>()); }
修复说明
- 传递递归返回值:遍历子Budget时接收递归调用的结果,一旦找到非null的目标对象,立刻向上层返回,确保结果能传递到最外层。
- 移除冗余循环:用清晰的线性递归逻辑替代无意义的
do-while结构。 - 防无限递归:通过
Set<Budget>记录已访问过的对象,避免循环引用引发的栈溢出问题。
调用时直接使用findBudget(rootBudget, targetSec)即可。
内容的提问来源于stack exchange,提问作者Александр Берестов
相关产品推荐
相关产品推荐

