"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 прилагается к каждому методу, который объявлен для выброса одного или нескольких типов исключений.

Внизу этой страницы.

Другие вопросы по тегам