воскресенье, 29 апреля 2018 г.

Кидаем исключения типа Object

Всем известно, что кидать исключения можно только, если объект наследуется от класса java.lang.Throwable. Для этого предназначена инструкция байткода ATHROW. Мне стало интересно, осуществляется ли проверка типа после компиляции.
Напишем небольшой метод, генерирующий нужный класс, с помощью библиотеки bcel.

Объявим класс ru.izebit.Test

Содержащий метод public static void main(String[] args) в котором вызывается метод test() и следом идет инструкция выхода из метода.

Добавим команды для вывода в консоль сообщения об исключении, которые будут выполняться, если оно возникнет:

Определим сигнатуру метода

И объявим в методе try-catch блок отлавливающий исключения типа java.lang.Object

Теперь напишем реализацию для метода test(). Создадим объект класса java.lang.Object и вызовем для него конструктор, следом вызовем throw и пробросим этот объект

Добавим сигнатуру для метода public static test() throw Object :

После этого, сохраним полученный класс в файл:

Содержимое файла, если его декомпилировать будет следующее:

Попробуем запустить:

Верификатор байткода не позволил выполнить код, но его всегда можно выключить добавив нужный флаг:

Как видим, программа отработала и исключение было поймано

Код целиком