我试图在scala REPL 2.11.8中定义一个包含1000个字段的case类。案例类定义如下:
case class Step2_Class(
`Response` : String,
`D1` : String,
`D2` : String,
`D3` : String,
`D4` : String,
//......,
`D999` : String,
`D1000` : String)
REPL正在等待回复。大约1小时后,抛出了堆栈溢出异常。
java.lang.StackOverflowError
at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1294)
at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)
at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
at scala.reflect.internal.Positions$DefaultPosAssigner.traverse(Positions.scala:288)
at scala.reflect.internal.Positions$DefaultPosAssigner.traverse(Positions.scala:282)
at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1283)
at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)
你有什么想法吗? scala不支持这种情况吗?有没有解决方法?
答案 0 :(得分:6)
似乎错误与字段数无关。
你说过了一段时间它就破了。如果没有返回条件,您确定没有递归函数吗? StackOverFlow infact是运行时错误。
当发生堆栈溢出时抛出,因为应用程序过于粗暴。
如果问题与编译时出现的字段数有关。
虽然问题与字段数无关,但创建包含1000个参数的代码或包含1000个字段的类是一个非常糟糕的主意。你可以想象D1和D15和D1000之间没有真正的区别,为什么不使用一个名为D的数组?
答案 1 :(得分:1)
直到最近,案例类别限制了22个字段。因此,如果编译器(或REPL本身)无法正常处理1000个字段,那就不足为奇了。您可以尝试通过设置JAVA_OPTS
(特别是堆栈溢出为-Xss
)来为其提供更多内存(特别是堆栈内存),例如。
JAVA_OPTS="$JAVA_OPTS -Xss8M" scala
但你必须猜测多少,它对速度没有多大帮助(除非它主要是垃圾收集,这很可能),并且它可能会因为更多的字段而失败