我对Android编程非常陌生,而且我正在使用Android Studio来定位Nexus 9.到目前为止,这是一次很棒/很棒的体验。
我终于遇到了一些奇怪的行为,当我尝试了一些有点高级的东西 - 抱歉这个古怪的问题时,我会对一些故障排除技巧感到高兴,因为观察结果并没有给我带来太大帮助上。这就是......
我有一个来自另一个的类,如下所示:
cWidget
,其方法为OnMyEvent()
cFrame
扩展cWidget
,覆盖OnMyEvent()
我的每个cWidgets
(以及我的cFrames
)都有一个“child”cWidgets
(和/或cFrames
)的链接列表,以形成一个树形结构。在我的cWidget.OnMyEvent()
方法和cFrame.OnMyEvent()
覆盖中,我循环遍历孩子cWidgets
并在每个上调用OnMyEvent()
- 这样我的活动就像是“传递下来”通过遍历树的层次结构。我的希望是,如果孩子是cWidget
,则会调用cWidget.OnMyEvent()
,如果它实际上是cFrame
,则会调用cFrame.OnMyEvent()
覆盖(这就是它在.NET中的工作方式) ,我应该编写一些代码来验证它是如何在Java中工作的,但我现在意识到这是一个假设)。
问题:当我在cWidget.OnMyEvent()
中调试并设置断点时,它永远不会触发,即使树中肯定有cWidgets
。当我从cFrame.OnMyEvent()
到cWidget.OnMyEvent()
的呼叫断点时,我检查了所有局部变量,一切看起来都正确;即,孩子是预期的cWidget
,没有任何东西是空的......但是如果我恢复执行,它仍然没有按预期跳过cWidget.OnMyEvent()
中的断点,它只是越过它。甚至更奇怪,如果我“进入”对cWidget.OnMyEvent()
的调用,我的应用程序将以“Unfortunately, MyFirstApp has stopped
”停止,并且我的logcat中没有异常报告。
所以...对于长篇描述非常抱歉,但我不确定什么是重要的,什么不重要。没有异常报告我不知道如何处理这个问题,并且我有可能通过在同一个树中将父项和子项链接在一起来破坏一些规则,并希望Java知道是否调用基本方法或覆盖。 (这在.NET中有效,到目前为止,这里的所有内容都有效,但在这种情况下可能不行。)
非常感谢任何想法或疑难解答提示。
编辑:我煮了它并测试了它,得到了类似的结果,但仍然不知道为什么。我使用AddChild和Handle方法定义了cA,然后导出了cB并覆盖了Handle。我创建了一个树(两个cAs作为cB的子)然后调用cB句柄。当我尝试构建一个树并调用Handle时它会崩溃。我猜我正在尝试这里不允许的.NET技巧。// *************
// BASE CLASS WITH AddChild, Handle
// *************
public class cA
{
public int m_Tag = 0;
protected cA ptr_FirstChild = null;
protected cA ptr_LastChild = null;
protected cA ptr_Parent = null;
protected cA ptr_NextSibling = null;
public cA(int tag)
{
m_Tag = tag;
}
public void AddChild(cA a)
{
a.ptr_Parent = this;
if (ptr_FirstChild == null)
{
ptr_FirstChild = a;
ptr_LastChild = a;
}
else
{
ptr_LastChild.ptr_NextSibling = a;
ptr_LastChild = a;
}
}
public void Handle()
{
int a;
a=3;
cA tmp = ptr_FirstChild;
while (tmp!= null)
{
tmp.Handle();
tmp = tmp.ptr_NextSibling;
}
}
}
// *************
// DERIVED CLASS, overrides Handle
// *************
public class cB extends cA
{
public cB(int tag)
{
super(tag);
}
@Override
public void Handle()
{
int a;
a=4;
cA tmp = ptr_FirstChild;
while (tmp!= null)
{
tmp.Handle();
tmp = tmp.ptr_NextSibling;
}
}
}
// *************
// Usage of classes
// build a tree with both cAs and cBs, then call
// root.Handle, hoping to traverse the tree.
// *************
public cA ptr_Root; // define the 'root' of the tree
cA a1 = new cA(1); // instantiate all leaves
cA a2 = new cA(2);
cB b1 = new cB(1);
ptr_Root = b1; // build the tree
b1.AddChild(a1);
b1.AddChild(a2);
b1.Handle(); // call Handle on the root, intending to traverse the tree, but this halts the program