2011-06-23 118 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; 
...