为什么Android模拟器会跳过我的return语句?

时间:2010-07-28 00:29:47

标签: android eclipse debugging

我在Windows模拟器下的Android 1.5应用程序中遇到意外行为,并使用Eclipse进行调试。以下是代码正在进行的概括:

if (someCondition) {
    System.out.println("got here");
    return "a";
}

if (someOtherCondition)
    return "b"

return "c";

如果我使用调试器逐步执行此代码,如果someCondition为true,则输出“got here”但跳转到最终返回语句,就像它将执行该行一样。据我所知,它正在返回“a”,但它令人困惑,因为它似乎会返回“c”。

如果someCondition为false,并且someOtherCondition为true,则调试器将步进return "b"行 - 它不会跳转到最终的return语句,然后将方法保留为预期

正如我所提到的,似乎它总是返回预期的行为,但调试器跳到错误的行的事实让我追逐幻像错误。完全重建,重新启动Eclipse并重新启动Windows都没有解决问题 - 它完全可以重新创建。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

请记住,您执行和调试的程序不是Java代码 - 它是从Java代码编译的字节码。

如果您单步执行优化的C ++代码,您可以期望光标在您的代码中跳转,例如愚蠢,具体取决于调度程序能够重新排列内容的程度。

Java更直接,但我认为返回指令仍然会稍微优化一下,即函数的清理部分是共享的,所以返回总能让你到那里。

不要过分依赖光标的精确位置 - 而是使用调试输出(在实践中也更快)。

答案 1 :(得分:0)

只是确定:返回“b”后,实际代码为分号吗?缺少分号总是会引起陌生感。

答案 2 :(得分:0)

我认为你遇到了dx工具对类文件做的一种优化。总之,在某些情况下,回报会合并。 您可以在http://www.netmite.com/android/mydroid/2.0/dalvik/docs/debugger.html上看到更多相关信息 在已知问题和限制下 但不幸的是,从那里开始并不清楚优化会在什么样的情况下生效,而且仍然不清楚为什么一个回报合并但另一个回报并不像你的例子......