加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java.lang.StackOverflowError的.为什么我在这里得到Stackoverfl

发布时间:2020-12-15 04:12:46 所属栏目:Java 来源:网络整理
导读:我有一个父级和子级项目列表,以层次结构显示.我想切换他们扩展的财产.因此,如果单击父级并且父级的子级正在显示,则所有父级子级将被折叠,反之亦然 Stackoverflow跟踪指向此行 if (childItem.getItemId() == item.getItemId()) { hideItemAndDescendants(chil
我有一个父级和子级项目列表,以层次结构显示.我想切换他们扩展的财产.因此,如果单击父级并且父级的子级正在显示,则所有父级子级将被折叠,反之亦然

Stackoverflow跟踪指向此行

if (childItem.getItemId() == item.getItemId()) {
    hideItemAndDescendants(childItem); //causing stack overflow
  }

我认为当一个方法一直无限地调用它时会发生堆栈溢出.但是在这种情况下,我有一个For循环,只循环遍历项目列表,列表大小只有10左右.

public boolean toggleNodeCollapseState(long itemId) {
        boolean changed = false; // a flag to determine if anything collapsed or expanded
         for (int i = 0; i < items.size(); i++) {
            Item childItem = items.get(i);
            if (childItem.getParentItemId() == itemId) {
                changed = true;
                childItem.setCollapsed(!childItem.isCollapsed());

                if (childItem.isCollapsed()) {
                    hideItemAndDescendants(childItem);
                } else {
                    showDescendants(childItem);
                }

            }
         }
        return changed;
    }

    public void hideItemAndDescendants(Item item) {
        item.hide();
        for (int i = 0; i < items.size(); i++) {
            Item childItem = items.get(i);
            if (childItem.getItemId() == item.getItemId()) {
                  hideItemAndDescendants(childItem);
            }
        }
    }

    public void showDescendants(Item item) {
        item.hide();
        for (int i = 0; i < items.size(); i++) {
            Item childItem = items.get(i);
            if (childItem.getItemId() == item.getItemId()) {
                childItem.show();
                if (!childItem.isCollapsed()) {
                    showDescendants(childItem);
                }
            }
        }
    }

解决方法

你在hideItemAndDecendants中有一个递归调用:

for (int i = 0; i < items.size(); i++) {
    Item childItem = items.get(i);
    if (childItem.getItemId() == item.getItemId()) {
          hideItemAndDescendants(childItem);
    }
}

因此,如果childItem.getItemId()== item.getItemId(),则调用hideItemAndDescendants(childItem);再次.这可能会导致无限循环导致stackoverflowexception.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读