Android应用程序在进入基类的方法时崩溃

Android应用程序在进入基类的方法时崩溃,android,Android,我对Android编程非常陌生,我正在使用Android Studio瞄准Nexus9。到目前为止,这是一次很好的经历 不过,我终于遇到了一些奇怪的行为,当我尝试一些稍微高级的东西时——很抱歉这个奇怪的问题,我很乐意提供一些故障排除技巧,因为观察结果并没有给我太多的信息。这是 我有一个类派生自另一个类,如下所示: cWidget,它有方法OnMyEvent() cFrame扩展cWidget,覆盖OnMyEvent() 我的每个cWidgets(因此我的cFrames)都有一个“child”

我对Android编程非常陌生,我正在使用Android Studio瞄准Nexus9。到目前为止,这是一次很好的经历

不过,我终于遇到了一些奇怪的行为,当我尝试一些稍微高级的东西时——很抱歉这个奇怪的问题,我很乐意提供一些故障排除技巧,因为观察结果并没有给我太多的信息。这是

我有一个类派生自另一个类,如下所示:

  • 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中工作。