【发布时间】:2014-08-26 04:48:58
【问题描述】:
编辑: 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 指出最终我的递归越来越深。
【问题讨论】:
-
如果你的返回类型是List,为什么要把它放到一个新的ArrayList中呢?你不能直接返回
Arrays.asList吗? -
@Rod_Algonquin 类似于以下内容:“第一、第二、第三、第四”
-
@besnep 就这样??而已??你能把整个字符串贴出来吗?
-
@MightyPork 我假设 OP 稍后会想要操作此列表,但您无法在列表中添加或删除元素,这将是
Arrays.asList的结果。 -
StackOverflowError 并不必然意味着递归是无限的。这只意味着递归太深了。 100000 的递归深度将导致 SOE,即使它被限制在这个深度。可以重现问题的测试用例(最好是作为单个(!)复制+可粘贴代码块!)会有所帮助。否则:如果递归深度有限,您可以尝试从
java -Xss2m YourApplication开始将堆栈大小增加到2MB,看看这是否足够您的情况。
标签: java recursion stack-overflow backtracking