java.lang.StackOverflowError的。为什么我在这里得到Stackoverflow异常

时间:2013-08-15 10:10:49

标签: java stack-overflow

我有一个父级和子级项目列表,以层次结构显示。我想切换他们的expanded财产。因此,如果单击父级并且父级的子级正在显示,则所有父级子级将被折叠,反之亦然

Stackoverflow跟踪指向此行

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

我认为当一个方法一直无限地调用它时会发生堆栈溢出。但是在这种情况下,我有一个只循环items列表的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);
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:5)

你的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。

答案 1 :(得分:2)

我的猜测是你有一个不是真树的数据关系 - 例如

Item1
  |
  \- Item2
       |
       \- Item1

在这一点上它会永远地减速。 (或者更简单地说,一个项目可能是它自己的孩子。)

诊断这种方法的一种方法是在hideItemAndDescendants的开头写一些输出来打印“this”的一些标识符 - 我相信你会在某个地方看到一个循环。