在生产环境中,我们偶尔会遇到与执行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)
...发布于 2010-09-25 03:33:06
这个问题是由于breadCrumbs是一个LinkedList引起的--我们在LinkedList中添加了太多的项目,调用subList暴露了这个问题。
发布于 2010-09-25 03:21:08
subList()方法返回一个由原始列表支持的视图。
根据javadoc:
如果通过返回的列表以外的任何方式对支持列表(即该列表)进行了结构化修改,则此方法返回的列表的语义将变得未定义。(结构修改是指改变这个列表的大小,或者以某种方式干扰它,使得进行中的迭代可能会产生不正确的结果。)
您正在对列表进行结构上的更改,所以所有的赌注都是无效的--任何事情都可能发生,包括无限递归,这似乎就是正在发生的事情。
发布于 2014-05-08 05:52:18
我在使用LinkedList标准库和fastutil objectarraylist (fastutil是一种快速高效的Java集合框架的内存实现)时也遇到了完全相同的问题。
使用
window = window.subList(index+1, window.size());导致堆栈溢出错误。我被替换为
window = new LinkedList<>( window.subList(index+1, window.size()) );一切都运行得很好。
希望它能有所帮助
https://stackoverflow.com/questions/3790171
复制相似问题