[英]Why Am I getting “Exception in thread ”main“ java.lang.StackOverflowError” in recursive java method?
[英]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.