首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.util.Sublist抛出StackOverFlowError

java.util.Sublist抛出StackOverFlowError
EN

Stack Overflow用户
提问于 2010-09-25 03:09:23
回答 6查看 2.4K关注 0票数 5

在生产环境中,我们偶尔会遇到与执行SubList操作相关的StackOverFlowError错误。有没有人以前见过这样的东西,并知道是什么导致了它?

这是被调用的代码,它会触发错误:

代码语言:javascript
复制
  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);
     }
    }

结果是:

代码语言:javascript
复制
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)
 ...
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-25 03:33:06

这个问题是由于breadCrumbs是一个LinkedList引起的--我们在LinkedList中添加了太多的项目,调用subList暴露了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2010-09-25 03:21:08

subList()方法返回一个由原始列表支持的视图。

根据javadoc:

如果通过返回的列表以外的任何方式对支持列表(即该列表)进行了结构化修改,则此方法返回的列表的语义将变得未定义。(结构修改是指改变这个列表的大小,或者以某种方式干扰它,使得进行中的迭代可能会产生不正确的结果。)

您正在对列表进行结构上的更改,所以所有的赌注都是无效的--任何事情都可能发生,包括无限递归,这似乎就是正在发生的事情。

票数 6
EN

Stack Overflow用户

发布于 2014-05-08 05:52:18

我在使用LinkedList标准库和fastutil objectarraylist (fastutil是一种快速高效的Java集合框架的内存实现)时也遇到了完全相同的问题。

使用

代码语言:javascript
复制
window = window.subList(index+1, window.size());

导致堆栈溢出错误。我被替换为

代码语言:javascript
复制
window = new LinkedList<>( window.subList(index+1, window.size()) );

一切都运行得很好。

希望它能有所帮助

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3790171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档