3

我注意到当finallyjava代码中有子句时,总是会.catchall生成识别finally块或使用.catchall标签内联它,但我没有找到任何关于是否是case或更多解释的在线信息,有人知道吗这个?

4

2 回答 2

4

是的,finally 块是可能生成 .catchall 的一种情况。但是,它也可以用于其他事情。例如,也可以在同步方法的情况下生成,保证锁被释放。

catch all 处理程序记录在dex 格式规范中。具体来说,在 code_item 中包含的 encoded_catch_handler 项中。

同样相关的是类文件规范中的等效数据。请参阅异常表中的 catch_type 项。

于 2012-12-29T06:46:43.347 回答
3

我想你可能期望太高了。

您要问的是(实际上)davlik 代码生成器/翻译器的代码生成模式。根据我的经验,人们不会详细描述编译器/代码生成器在幕后所做的事情:

  • 这些行为不需要指定。实际上,规范可能会通过过度约束实现来造成伤害。
  • 这样的文档编写和维护成本很高。
  • 这样的文件将没有多少读者来证明费用的合理性。

我建议你查看 davlik 翻译器的源代码,看看它实际上做了什么。(尝试寻找“catchall”......)


请注意,dex 格式规范为您提供了输出“语言”及其含义。这限制了 davlik 翻译器可以做什么,但它不会告诉您翻译器在所有情况下实际上要做什么。

于 2012-12-29T06:51:11.170 回答