Arrays.asList中的Stackoverflow(str.split(“,”)) - >由于错误的递归

时间:2014-07-04 22:11:51

标签: java recursion stack-overflow backtracking

编辑: commaString操作不是问题所在。这都怪我。见下文。

我编写了一个将逗号字符串转换为字符串列表的方法。 但是我在这个方法中得到了一个stackoverflow。

Exception in thread "main" java.lang.StackOverflowError
at java.util.ArrayList.subList(Unknown Source)
at java.lang.String.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at de.dhbw.horb.routePlanner.SupportMethods.commaStrToStrList(SupportMethods.java:82)

public static List<String> commaStrToStrList(String commaStr) {
    if (commaStr == null)
        return null;
    return new ArrayList<String>(Arrays.asList(commaStr.split(",")));
}

那么为什么会这样呢?我的commaStr要大吗?如果是,还有什么可以用于此?

方法doNextNode(id)是一个递归: https://github.com/Spenhouet/RoutenplanerProjekt/blob/master/Routenplaner/main/de/dhbw/horb/routePlanner/parser/JDomGraphDataCreator.java

编辑:

问题是由于我的递归方法中缺少一个子句。因此递归变得非常深刻。起初我将我的最大堆栈大小推到3GB(-Xss3g),但它在内存不足异常时结束。 :/

然后我想到是否有可能我的递归在某一点开始并且一次又一次地做同样的事情。因此,我添加了一个地图,用于保存每个被访问节点(id),并删除节点以进行失败的重新注册(回溯)。

现在它就像一个魅力。 感谢Marco13 指出最终我的递归越来越深。

1 个答案:

答案 0 :(得分:3)

如果您的字符串太大而导致String.split()中断,则您有以下选项:

  1. 尝试StringTokenizer,<罢工>它不太可能更好但是值得一试。更新:我检查了它的源代码,它看起来很简单,内存效率高,与选项3等效。
  2. 使用原始正则表达式Matcher并手动构建列表。
  3. 手动完成所有解析:迭代字符,如果点击逗号,请创建一个字符串,其中包含最后一个逗号和当前逗号之间的字符,并将其添加到列表中。
  4. 如果内存不足,则需要采用更复杂的方法,可能需要将字符串写入文件并以较小的块读回。