【问题标题】:StackOverflowError error with maven package [closed]Maven包的StackOverflowError错误[关闭]
【发布时间】:2021-04-23 18:39:12
【问题描述】:

我有一个 Scala 类,其中包含一个方法,该方法有 1000 个左右的 if-else 条件(没有简单的模式可以用来组合它,所有条件本质上都大不相同)。

    val a = "some string"
    if(a.contains("xx")){
      "aa_xx"
    }
    else if(a.contains("yy")){
      "121_Some random string"
    }
... and so on about 1000's conditions

当尝试使用 maven 构建 jar 时,我收到了 StackOverflowError。 尝试使用 Maven 的自定义 xml 值构建,但仍然看到相同的错误。

[ERROR] error: java.lang.StackOverflowError
[INFO]  at scala.reflect.internal.Types$$anonfun$47.apply(Types.scala:4579)
[INFO]  at scala.reflect.internal.Types$$anonfun$47.apply(Types.scala:4579)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.isSubType1(TypeComparers.scala:319)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.isSubType(TypeComparers.scala:278)
[INFO]  at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:16)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.retry$3(TypeComparers.scala:520)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.fourthTry$1(TypeComparers.scala:547)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.classOnRight$1(TypeComparers.scala:460)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.thirdTryRef$1(TypeComparers.scala:464)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.thirdTry$1(TypeComparers.scala:478)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.secondTry$1(TypeComparers.scala:450)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.firstTry$1(TypeComparers.scala:411)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.isSubType2(TypeComparers.scala:552)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.isSubType1(TypeComparers.scala:320)
[INFO]  at scala.reflect.internal.tpe.TypeComparers$class.isSubType(TypeComparers.scala:278)

关于如何修复它的任何建议?

【问题讨论】:

  • 您是否尝试过使用-Xss 增加堆栈大小?
  • @HaraldGliebe 我在哪里可以配置它?
  • MAVEN_OPTS="-Xss10m" mvn package
  • 如果您的源代码重复性足以使编译器崩溃,那么也许可以改进您的代码。我不能正确地相信这段代码不能以更理智的方式编写。谁会认真维护一个包含数千个检查的文件,而这本应该是一张简单的地图?
  • 我只是出于示例目的发布了其他逻辑条件,其中包含许多 AND 以及 OR 检查,有些没有 AND,因此无法使用 map,因此选择有很多 if -else,这是一种来自其他资源的数据聚合逻辑。

标签: java scala maven


【解决方案1】:

不要使用 1000 个else-if 语句。使用循环。

// Java example
final String[] SUBSTRINGS = { "xx", "yy" };

for (String sub : SUBSTRINGS) {
    if (a.contains(sub)){
        "aa_" + sub
        break;
    }
}

【讨论】:

    【解决方案2】:

    看起来增加scala-maven-plugin 的 Xss 参数解决了这个问题

       <jvmArgs>
            <jvmArg>-Xss4m</jvmArg>
          </jvmArgs>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2021-01-21
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多