scala,IntelliJ:stackoverflow异常

时间:2015-08-09 06:51:24

标签: java scala intellij-idea

lang.StackOverflow异常在我的代码中,但我认为问题在于IntelliJ而不是代码问题。所以这是交易(代码片段):

bigContentView

我在这里缺少什么?

编辑:我怀疑这与toString方法有关。但我不是在Node类上调用toString方法。 intellij有没有机会调用该方法?如果是这样,如何抑制它。

TIA

2 个答案:

答案 0 :(得分:2)

当您将node2添加为node1的子项时,它会创建循环依赖项。 如果你检查scala编译器为它生成了什么: scalac -Xprint:typer NodeTest.scala

hashCode函数是这样的:

override <synthetic> def hashCode(): Int = {
  <synthetic> var acc: Int = -889275714;
  acc = Statics.this.mix(acc, data);
  acc = Statics.this.mix(acc, Statics.this.anyHash(children));
  acc = Statics.this.mix(acc, Statics.this.anyHash(parents));
  Statics.this.finalizeHash(acc, 3)
};

因此node1计算哈希码:它需要node2的哈希码(因为node2是node1的子节点),两个计算node2的哈希码,它需要node1的哈希码(因为node1是node2的父节点)

为什么哈希码在这里很重要?

因为您正在使用Set,在使用哈希代码之前检查元素是否已经存在。

你有没有注意到BTW:

node1.children.append(node2)
node1

还提供stackoverflow。我不知道为什么但看起来像toString也存在循环依赖的问题。

修改 案例类通常用于不可变数据结构。因此,为了模拟您想要实现的目标,您可以使用类。

class Node(val data: Int) {
   var parents : ListBuffer[Node] =  ListBuffer[Node]()
   var children : ListBuffer[Node] =  ListBuffer[Node]()
}
scala> val node1 = new Node(1)
node1: Node = Node@624ea235

scala> val node2 = new Node(2)
node2: Node = Node@12591ac8

scala> node1.children.append(node2)

scala> node2.parents.append(node1)

答案 1 :(得分:1)

我认为由于您的类层次结构,您在equalshashCode方法中有无限递归。 Node的实例具有对其父母和子女的循环引用,因此这些方法中的一种无限运行。