读取对象时Java堆栈溢出

读取对象时Java堆栈溢出,java,object,arraylist,stack,overflow,Java,Object,Arraylist,Stack,Overflow,我正在尝试将一个对象加载到Java中,这个对象是我从自己编写的程序中保存的 加载时,Java抛出堆栈溢出错误 我正在加载的对象中有大约一千个条目对象ArrayList,导出时总大小约为128 Kb 我知道当我进行过多的递归调用时会发生堆栈溢出,但我不明白在一个对象数组列表中加载是如何导致这种情况发生的 我是一名自学成才的程序员,因此任何能帮助我更好地理解问题的见解都将不胜感激 这是我试图加载的类的代码(Memboric) public类Memboric实现了可序列化{ /** * *Membor

我正在尝试将一个对象加载到Java中,这个对象是我从自己编写的程序中保存的

加载时,Java抛出堆栈溢出错误

我正在加载的对象中有大约一千个条目对象
ArrayList
,导出时总大小约为128 Kb

我知道当我进行过多的递归调用时会发生堆栈溢出,但我不明白在一个对象数组列表中加载是如何导致这种情况发生的

我是一名自学成才的程序员,因此任何能帮助我更好地理解问题的见解都将不胜感激

这是我试图加载的类的代码(Memboric)

public类Memboric实现了可序列化{
/**
*
*Memboric Core存储AI运行所需的各种数据库。
*
*@作者布雷登·麦金尼
*@date 5/14/2013
*/
私有静态最终长serialVersionUID=44778891146536052L;
ArrayList knownWords=新的ArrayList();
HashMap同义词库=新HashMap();
ArrayList conversations=新建ArrayList();
文件位置=空;
公共静态内存加载(文件位置){
Memboric Memboric;
试一试{
FileInputStream文件=新FileInputStream(位置);
ObjectInputStream oo=新的ObjectInputStream(文件);
memboric=(memboric)oo.readObject();
oo.close();
System.out.println(“Memboric堆芯已成功加载和安装”);
返回内存;
}捕获(FileNotFoundException fn){
System.err.println(“未能加载Memboric Core”);
}捕获(InvalidClassException ic){
System.err.println(“Memboric内核不兼容”);
}捕获(例外e){
e、 printStackTrace();
}
System.err.println(“创建新的Memboric内核”);
返回新的Memboric();
}
公共布尔保存(文件位置){
这个位置=位置;
试一试{
FileOutputStream文件=新FileOutputStream(位置);
ObjectOutputStream oo=新的ObjectOutputStream(文件);
oo.writeObject(this);
oo.close();
System.out.println(“Memboric Core已成功保存”);
返回true;
}捕获(FileNotFoundException ex){
试一试{
如果(location.createNewFile())保存(location);
}捕获(IOEXX异常){
exx.printStackTrace();
}
}捕获(例外e){
e、 printStackTrace();
}
返回false;
}
它的姐妹类(Word)包含:

    public class Word implements Serializable{

    private static final long serialVersionUID = 790247641945230263L;

    private String word;

    ArrayList<String> definitions = new ArrayList<String>();
    ArrayList<Word> synonyms = new ArrayList<Word>();
    ArrayList<String> tags = new ArrayList<String>();
    HashSet<String> links = new HashSet<String>();
    }
公共类Word实现可序列化{
私有静态最终长serialVersionUID=790247641945230263L;
私有字符串字;
ArrayList定义=新的ArrayList();
ArrayList同义词=新的ArrayList();
ArrayList标记=新的ArrayList();
HashSet links=新的HashSet();
}
错误本身可以在这里看到(它相当大):

此外,上面的代码被缩减以节省空间(我删除了不相关的部分),但是可以在这里看到完整的类:


同义词
移到
单词
之外,并在Memboric或其他类别中跟踪它:

class Memboric {

    private Map<String, Word> dictionary;
    private Map<Word, Set<Word>> thesaurus;

}
class Memboric{
专用地图词典;
私人地图词典;
}
基本上,从设计的角度来看,一个词可以知道它自己的属性,但不应该知道它与其他词的关系;每个词都是独立的。一些高级对象可以知道词之间的关系。这可以防止对象引用之间的循环


编辑:假设Word正确地实现了
hashCode()
equals()
,则上述方法有效;如果没有正确实现或太麻烦,则使用
Map
对同义词表进行编辑。

您可以从编辑文章开始,以包含堆栈跟踪(完成)然后告诉我们代码中的哪一行引发了异常。等一下,我会编辑帖子。那么数组中有什么?你没有循环引用吗?哦,我现在明白问题了。对象包含一个单词列表,每个单词都包含对另一个同义词的引用。我必须找到绕过这个的方法。那不应该引起问题-ObjectInputStream缓存新实例,然后针对每个新对象检查缓存。这意味着循环引用应该从缓存中解析,而不是导致无限循环。
class Memboric {

    private Map<String, Word> dictionary;
    private Map<Word, Set<Word>> thesaurus;

}