"throws" и "аннотация для исключения" в байт-коде Dalvik
Почему байт-код генерируется как
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/FileNotFoundException;
}
.end annotation
скорее, чем .throws Ljava/io/FileNotFoundException
если метод объявляет throws FileNotFoundException
в шапке в коде java?
2 ответа
Краткий ответ: в формате dex нет определенной концепции "бросков". Когда java classfile конвертируется в формат dex, добавляется аннотация Throws, которая содержит эту информацию.
Чуть дольше отвечу:
Концепция проверенного исключения имеет значение только во время компиляции, а не во время выполнения. Виртуальная машина dalvik не знает и не заботится о том, какие исключения может выдать ваш метод. Что касается этого, все является непроверенным исключением. Именно Java-компилятор обеспечивает, чтобы проверенные исключения были объявлены в вашем предложении throws.
Таким образом, не имеет смысла добавлять конкретную концепцию "throws" в файл dex. Вместо этого эта информация хранится с использованием более общей функции аннотации.
Похоже, вы используете что-то вроде dex2jar, чтобы преобразовать файл dex обратно в набор файлов классов и затем использовать для этого jasmin. Вполне вероятно, что dex2jar не переназначает аннотации Throws из файла dex обратно в атрибут Exception в файле классов, хотя я специально не проверял, так ли это.
dalvik.annotation.Throws появляется на методах
Аннотация Throws прилагается к каждому методу, который объявлен для выброса одного или нескольких типов исключений.
Внизу этой страницы.