示例问题:
kotlin和java代码报错堆栈信息的差异
- 报错堆栈的行数信息表示不同
- java的报错行数是当前类的的第N行
- kotlin的报错行数是当前指向的函数的第N行
- 如示例问题中,第二行的报错信息【PlayVM$play$1.invoke(PlayVM.kt:3)】是指PlayVM类的play方法的第一个匿名内部类的invoke方法的第三行
- 查询的类不同
- kotlin的报错指向的是kotlin转换成的java代码。即kotlin --> bytecode --> java
- 可以使用android studio自带功能进行转换
- java的报错直接在对应java类中查找即可
- kotlin的报错指向的是kotlin转换成的java代码。即kotlin --> bytecode --> java
示例问题分析过程
- 第7行和第6行
- 如下图所示,loadSongList的第二个匿名类的第一个invoke方法调用了重载的第二个invoke方法。代码实现和堆栈调用一致。
- 第5行和第4行
- 如下图所示,代码实现和堆栈调用一致。
- 第3行、第2行和第1行
- 如下图所示
写在最后
- 对于有些个别的堆栈行数对应不上的,说明apk编译的class和本地studio反编译出来的代码不一致,不一致的原因猜测是编译器对代码执行的顺序做了优化。但是根据代码以及堆栈调用信息仍然可以定位到具体代码位置