Java自定义MyLinkedList.first()调用后current重置为null致程序死循环
问题排查与解决思路
核心问题本质
你遇到的是自定义链表MyLinkedList<Genome>的状态无法持久化:调用first()时方法内部能把current设为首节点,但方法返回后current变回null,导致Population.nextGeneration()里的设置完全无效,最终种群遍历逻辑失效,字符串进化无法推进,陷入无限循环。
大概率的出错点
MyLinkedList的current变量定义错误
如果你在first()方法里定义了局部的current变量,而非操作类的成员变量,那方法内的修改根本不会影响链表实例的状态。比如这种错误写法:public void first() { Node<T> current = head; // 这里的current是方法局部变量,和类成员无关 }正确的应该是直接操作类级别的
current成员:public class MyLinkedList<T> { private Node<T> head; private Node<T> current; // 类成员变量,保存当前遍历位置 public void first() { this.current = this.head; // 直接修改实例的current } }Population内重复创建MyLinkedList实例
如果nextGeneration()方法里每次都重新new一个MyLinkedList,那之前设置的current状态肯定会丢失。比如错误写法:public void nextGeneration() { MyLinkedList<Genome> population = new MyLinkedList<>(); // 每次都新建,之前的状态清零 population.first(); // ... 其他逻辑 }要确保
population是Population类的成员变量,整个生命周期复用同一个实例:public class Population { private MyLinkedList<Genome> population; // 类成员,复用同一个链表实例 public void nextGeneration() { population.first(); // 操作同一个实例的current // ... 遍历、进化逻辑 } }MyLinkedList的其他方法意外重置current
检查链表的next()、add()等方法,有没有在执行时不小心把current设为null的逻辑,比如某些边界处理错误。
验证与修复步骤
- 先单独测试
MyLinkedList的状态保持:写个简单的测试方法,调用first()后打印current的引用,再调用next()几次,再调用first(),确认current能正确回到首节点,不会变成null。 - 修复
first()方法的变量作用域问题,确保操作的是类成员current。 - 检查
Population类中population变量的初始化和使用,避免方法内重复创建实例。 - 修复后重新运行
EvolutionTest,观察是否能正常遍历种群,推进进化流程,跳出无限循环。
内容的提问来源于stack exchange,提问作者rodew
相关产品推荐
相关产品推荐

