【发布时间】:2010-09-24 19:09:23
【问题描述】:
我们在生产中偶尔会遇到与执行 SubList 操作相关的 StackOverFlowError 错误。有没有人以前见过这样的事情并知道是什么原因造成的?
这是触发错误的调用代码:
FacesContext context = FacesContext.getCurrentInstance();
String newViewID = context.getViewRoot().getViewId();
if (newViewID != null) {
if (breadCrumbs.contains(newViewID)) {
// Trims the list upon going back to allow for multiple back button requests.
// This is lightweight and not intended for a complex circular navigation.
breadCrumbs = breadCrumbs.subList(0, breadCrumbs.indexOf(newViewID) + 1);
} else {
breadCrumbs.add(newViewID);
}
}
结果:
Caused By: java.lang.StackOverflowError
at java.util.SubList$1.<init>(AbstractList.java:688)
at java.util.SubList.listIterator(AbstractList.java:687)
at java.util.SubList$1.<init>(AbstractList.java:688)
at java.util.SubList.listIterator(AbstractList.java:687)
...
【问题讨论】:
-
您使用的是哪个版本的 JDK?来自开放 JDK 的子列表似乎没有这个无限循环问题:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
-
原因如下(可变列表的子列表),但看起来您想要做的是从 crumb 列表中删除尾随元素,而不是用它们创建旧列表的新视图隐藏(子列表的作用)。
标签: java error-handling stack-overflow