Java 内部错误:糟糕的稀疏开关魔术-这意味着什么?

Java 内部错误:糟糕的稀疏开关魔术-这意味着什么?,java,android,dalvik,Java,Android,Dalvik,今天我得到了一个stacktrace,有一个非常奇怪的错误。事实上,我可能是第一个得到这个答案的人(耶!),因为在发布这个问题之前,谷歌唯一出现的“糟糕的稀疏开关魔术”是在Android源代码中 下面是stacktrace(Android 2.3.4)的一部分: 从MyItemAdapter构造函数退出时引发错误。因为它是内部的,我很确定这不是我的直接过错——但我只是想知道,Dalvik VM内部发生了什么坏事 这个错误似乎与开关指令有关,只是澄清一下-我没有在MyItemAdapter的构造函

今天我得到了一个stacktrace,有一个非常奇怪的错误。事实上,我可能是第一个得到这个答案的人(耶!),因为在发布这个问题之前,谷歌唯一出现的“糟糕的稀疏开关魔术”是在Android源代码中

下面是stacktrace(Android 2.3.4)的一部分:

从MyItemAdapter构造函数退出时引发错误。因为它是内部的,我很确定这不是我的直接过错——但我只是想知道,Dalvik VM内部发生了什么坏事

这个错误似乎与
开关
指令有关,只是澄清一下-我没有在MyItemAdapter的构造函数中直接使用它。为了理解出了什么问题,我可能需要仔细研究大量与dalvik相关的代码,所以我想问你——也许有人能解释我——出了什么问题?我只是好奇

编辑


下面是一段引发该错误的Android代码:

有一个稀疏开关dex字节代码,它将Android解释器指向一个实际上不是稀疏开关语句的内存区域

Dex字节码可以表示两种类型的开关语句:压缩或稀疏。压缩开关语句只需存储最低值即可打开。每个后续的开关值都比前一个值增加一,因此case语句只在字节码中存储分支目标。稀疏开关格式有一个条目,每个case语句对应一个值和分支目标。请参阅“Dalvik VM字节码”文档()中的“稀疏交换机负载”部分

dex中的稀疏开关语句由第二个字节为0x02()的noop字节码指令指示。noop指令的第一个字节始终为0x00,因此稀疏开关语句的完整“魔术签名”为0x0200


实际执行稀疏开关语句的dex字节码指令称为稀疏开关。它的代码是0x2c,它还需要一个寄存器来测试switch语句和switch表的地址。我认为您的dex文件中开关表的地址不正确。如果没有更多的信息,很难说为什么。

正如您所说,您找到错误引用的唯一其他地方是源代码中。也许最好的地方是在错误抛出点附近的源代码中?另外,当你找到答案时,请务必发回这里,以便其他人也可以学习@cdeszaq-这就是我所做的,这就是我关于开关指令的结论的来源。进一步的分析可能会花费我很多时间(但这不会阻止我做研究),所以我发布了这个问题。当然,如果我是第一个找到答案的人,我会把它放在这里!在我的情况下,我无法访问报告错误的设备(而且只发生过一次)。所以,我很确定我不能给你提供任何有用的额外信息。无论如何,你的回答很好地解释了这个问题。
java.lang.InternalError: bad sparse switch magic
at org.my.app.MyItemAdapter.(MyItemAdapter.java:64)
at org.my.app.MyActivity.onCreate(MyActivity.java:78)