You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:19