Android应用程序在进入基类的方法时崩溃
我对Android编程非常陌生,我正在使用Android Studio瞄准Nexus9。到目前为止,这是一次很好的经历 不过,我终于遇到了一些奇怪的行为,当我尝试一些稍微高级的东西时——很抱歉这个奇怪的问题,我很乐意提供一些故障排除技巧,因为观察结果并没有给我太多的信息。这是 我有一个类派生自另一个类,如下所示:Android应用程序在进入基类的方法时崩溃,android,Android,我对Android编程非常陌生,我正在使用Android Studio瞄准Nexus9。到目前为止,这是一次很好的经历 不过,我终于遇到了一些奇怪的行为,当我尝试一些稍微高级的东西时——很抱歉这个奇怪的问题,我很乐意提供一些故障排除技巧,因为观察结果并没有给我太多的信息。这是 我有一个类派生自另一个类,如下所示: cWidget,它有方法OnMyEvent() cFrame扩展cWidget,覆盖OnMyEvent() 我的每个cWidgets(因此我的cFrames)都有一个“child”
,它有方法cWidget
OnMyEvent()
扩展cFrame
,覆盖cWidget
OnMyEvent()
cWidgets
(因此我的cFrames
)都有一个“child”cWidgets
(和/或cFrames
)链接列表,以形成树结构。在我的cWidget.OnMyEvent()
方法和cFrame.OnMyEvent()
重写中,我循环遍历子cWidget
并对每个子对象调用OnMyEvent()
,这样我的事件就可以通过遍历树在层次结构中“向下传递”。我的希望是,如果孩子是cWidget
它调用cWidget.OnMyEvent()
,如果它实际上是cFrame
它调用cFrame.OnMyEvent()
覆盖(这是它在.NET中的工作方式,我应该编写一些代码来验证它在Java中的工作方式,但我现在意识到这是目前的一个假设)
问题是:当我在
cWidget.OnMyEvent()
中调试并设置断点时,它从不触发,即使树中肯定有cWidget
。当我中断从cFrame.OnMyEvent()
到子cWidget.OnMyEvent()
的调用,并检查所有局部变量时,一切看起来都正常;也就是说,孩子是一个cWidget
,没有任何内容是空的。。。但是,如果我继续执行,它仍然不会像预期的那样触发cWidget.OnMyEvent()中的断点,它只是跳过它。更奇怪的是,如果我“介入”调用cWidget.OnMyEvent()
,我的应用程序就会停止,并出现一个“不幸的是,MyFirstApp已停止”
”,并且在我的日志中没有异常报告
所以。。。很抱歉这么长的描述,但我不确定什么是重要的,什么不是。在没有异常报告的情况下,我不确定如何处理这个问题,而且我很有可能打破了一些规则,将父级和子级链接在同一棵树中,希望Java知道是调用基方法还是重写。(这在.NET中起作用,到目前为止,这里的一切都起作用,但在本例中可能不起作用。)
非常感谢您提供的任何想法或故障排除提示
编辑:我对它进行了简化和测试,得到了类似的结果,但仍然不知道为什么。我用AddChild和Handle方法定义了cA,然后派生了cB和overcode Handle。我创建了一个树(两个CA作为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
如果您得到一个异常,您将在logcat中得到一个stacktrace。看看这里:在此之前,我已经设法触发了许多异常,并且它总是出现在logcat中。这就是这一个的奇怪之处,也许它不是例外,它只是停止/停止,日志中没有任何内容。“不幸的是,MyFirstApp已停止”应该会生成stacktrace,如果一切正常,它应该显示在您的日志中。我的日志中绝对没有任何内容。它只在“单步执行”时发生,所以很明显它破坏了调试器,所以我想所有的赌注都没有了。我现在主要好奇的是,上面的cA/cB树方案和遍历是否应该在Java中工作。