我在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都没有解决问题 - 它完全可以重新创建。
有什么想法吗?
答案 0 :(得分:4)
请记住,您执行和调试的程序不是Java代码 - 它是从Java代码编译的字节码。
如果您单步执行优化的C ++代码,您可以期望光标在您的代码中跳转,例如愚蠢,具体取决于调度程序能够重新排列内容的程度。
Java更直接,但我认为返回指令仍然会稍微优化一下,即函数的清理部分是共享的,所以返回总能让你到那里。
不要过分依赖光标的精确位置 - 而是使用调试输出(在实践中也更快)。
答案 1 :(得分:0)
只是确定:返回“b”后,实际代码为分号吗?缺少分号总是会引起陌生感。
答案 2 :(得分:0)
我认为你遇到了dx工具对类文件做的一种优化。总之,在某些情况下,回报会合并。 您可以在http://www.netmite.com/android/mydroid/2.0/dalvik/docs/debugger.html上看到更多相关信息 在已知问题和限制下 但不幸的是,从那里开始并不清楚优化会在什么样的情况下生效,而且仍然不清楚为什么一个回报合并但另一个回报并不像你的例子......