StackOverflowError与Maven 3.3.9,Java 8和Scala 2.12

时间:2017-01-13 11:07:14

标签: scala java-8 maven-3 stack-overflow

当我尝试使用java.lang.StackOverflowError和Java 1.8.0_112编译和打包代码时,我得到mvn package

我的代码与Java 7编译得很好。

我尝试设置JAVA_OPTS=-Xss512m并尝试使用1G,但总是会遇到同样的错误。

代码是用Scala编写的,我在我的pom.xml中使用这些版本:

    <scala.version>2.10.4</scala.version>
    <spark.version>1.6.0-cdh5.7.1</spark.version>
    <hbase.version>1.2.0-cdh5.7.1</hbase.version>
    <kafka.version>0.9.0.0</kafka.version>
    <jackson.version>2.7.2</jackson.version>
    <iodadm.version>05.4.1</iodadm.version>

我也尝试使用Scala版本2.12.0,因为2.10.x与Java 8不兼容。

错误堆栈的一部分:

INFO] java.lang.reflect.InvocationTargetException
[INFO]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[INFO]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[INFO]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[INFO]  at java.lang.reflect.Method.invoke(Method.java:498)
[INFO]  at scala_maven_executions.MainHelper.runMain(MainHelper.java:164)
[INFO]  at scala_maven_executions.MainWithArgsInFile.main(MainWithArgsInFile.java:26)
[ERROR] Caused by: java.lang.StackOverflowError
[INFO]  at java.security.AccessController.doPrivileged(Native Method)
[INFO]  at java.io.PrintWriter.<init>(PrintWriter.java:116)
[INFO]  at java.io.PrintWriter.<init>(PrintWriter.java:100)
[INFO]  at scala.reflect.api.Printers$class.render(Printers.scala:168)
[INFO]  at scala.reflect.api.Universe.render(Universe.scala:59)
[INFO]  at scala.reflect.api.Printers$class.show(Printers.scala:190)

还有一件事,stackoverflow错误通常是运行时执行错误,如何在编译期间获取它?

[已添加1]我发现此错误是由至少包含150个属性的scala类引起的

[已添加2]抛出此错误的函数是等于函数,我是这样开发的:

def equals(other:MyClass):Boolean = {
  this.P1 == other.P1 &&
  this.P2 == other.P2 &&
  ... ~ 180 similar line ...
  this.P180 == other.P180
}

谢谢。

1 个答案:

答案 0 :(得分:0)

我通过在许多

中拆分逻辑运算来解决问题
def equals(other:MyClass):Boolean = {
   Boolean bool1=this.P1 == other.P1 && 
     this.P2 == other.P2 &&
     ...
     this.P100 == other.P100
   Boolean bool2=this.P101 == other.P101 && 
     this.P102 == other.P102 &&
     ...
     this.P200 == other.P200   

  bool1 && bool2
}

解决此类问题的方法是逐步编译代码,直到找到抛出错误的代码块

我希望这能帮到某人