2011-06-23 91 views
0

我有這個簡單的方法在這裏:退貨聲明不起作用!

private Node addItem(Node current, Node target) { 
    if (current.data.getId() < target.data.getId()) { 
     if (current.larger == null) { 
      current.larger = target; 
      Log.i("BinaryTree", "Added item: " + target.data.getId()); 
      return target; 
     } 
     return addItem(current.larger, target); 
    } else { 
     if (current.smaller == null) { 
      current.smaller = target; 
      Log.i("BinaryTree", "Added item: " + target.data.getId()); 
      return target; 
     } 
     return addItem(current.smaller, target); 
    } 
} 

當我調試它,該代碼獲取到線「將目標;」,只是跳過它,並進入最後的return語句 - 「返回的addItem(電流.smaller,target);'! 我從來沒有見過這樣的跆拳道?!?!

+0

我應該走出去的方法,如果達到return語句 –

+2

哦,等等等等,這是一個遞歸方法<_ < –

+0

也許你可以看看字節碼。你只能在調試器中獲得雙重回報,或者也可以在程序自行運行時獲得雙重回報? – toto2

回答

8

您可能已經看到了您的調試跳轉「返回」的一種方法。

你在調用addItem遞歸;所以最終的回報,它實際上會添加它並返回;將「似乎」跳到另一個返回,僅僅是因爲您從那裏返回的方法調用發起了。

+0

我看了堆棧跟蹤,但沒有顯示遞歸調用,除了使用另一種方法進行的單個調用 – saarraz1

+0

在這種情況下,你能至少從第一個返回的斷點發布你的問題中的整個堆棧跟蹤嗎? (所以在繼續'最後'返回) – Yhn

+0

我認爲eclipse沒有正確顯示堆棧 我在調試窗口中看不到遞歸調用 – saarraz1

2

如果它到達該返回語句,那麼它肯定應該從該方法返回。如果你不知道(因爲它是遞歸的),請嘗試放置幾條System.out.println()語句。

例如:

... 
Log.i("BinaryTree", "Added item: " + target.data.getId()); 
System.out.println("Returning: " + target.toString()); 
return target; 
...