簡體   English   中英

java.lang.StackOverflowError的。為什么我在這里得到Stackoverflow異常

[英]java.lang.StackOverflowError. Why am I getting a Stackoverflow exception here

我有一個父級和子級項目列表,以層次結構顯示。 我想切換他們expanded財產。 因此,如果單擊父級並且父級的子級正在顯示,則所有父級子級將被折疊,反之亦然

Stackoverflow跟蹤指向此行

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

我認為當一個方法一直無限地調用它時會發生堆棧溢出。但是在這種情況下,我有一個For循環,只循環遍歷items列表,列表大小只有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。

我的猜測是你有一個不是真樹的數據關系 - 例如

Item1
  |
  \- Item2
       |
       \- Item1

在這一點上,它將永遠減少。 (或者更簡單地說,一個項目可能是它自己的孩子。)

診斷這個的一種方法是在hideItemAndDescendants的開頭寫一些輸出來打印“this”的一些標識符 - 我相信你會在某個地方看到一個循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM