Java中BufferedReader读文件时引发StackOverflowError的原因排查
问题分析与解决
不是整数导致的失败,核心原因是递归实现的链表尾插法在处理大文件时,递归调用深度超过了JVM的栈容量,从而抛出StackOverflowError。
具体原因
你的WordList.AddWordAtTail(WordList end)方法采用递归方式遍历链表到尾部添加节点:
public void AddWordAtTail(WordList end) { if (this.nextNode == null) { this.nextNode = end; } else { this.nextNode.AddWordAtTail(end); // 递归调用,每一次调用都会占用栈空间 } }
第一个文件内容少,生成的链表节点数少,递归深度小,不会触发栈溢出;但第二个文件内容更多,处理后链表节点数大幅增加,递归调用次数过多,栈帧堆积超过JVM栈的最大容量,就会抛出StackOverflowError。
额外代码问题
另外你的WordList类中,AddWordAtTail(String w)方法里用到了headNode,但类定义里并没有声明这个成员变量,这会导致编译错误,需要补充定义:
public class WordList { protected String word; protected WordList nextNode; protected WordList headNode; // 补充headNode定义 // 构造方法和其他代码... }
解决方案
把递归的尾插法改成迭代实现,避免递归栈溢出:
public void AddWordAtTail(WordList end) { WordList current = this; // 迭代遍历到链表尾部 while (current.nextNode != null) { current = current.nextNode; } current.nextNode = end; }
迭代方式不会不断创建栈帧,无论链表多长都能正常处理。
内容的提问来源于stack exchange,提问作者javalearner
相关产品推荐
相关产品推荐

