Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Контроль исключений

10
31 октября 2005 года
Freeman
3.2K / / 06.03.2004
Вопрос, скорее, по стандарту языка Java и его реализации. Как-то пытался изучать Java и помню, что исключения являются частью декларации функции, т. е. указывается, какие конкретно исключения можно от нее ожидать.

Внимание, вопрос! :) Как это контролируется компилятором? Ведь исключения могут вызывать не только пользовательские или библиотечные процедуры, но и процессор, например. Если AV не может возникнуть - в Java нет адресов и адресной арифметики, то как быть с делением на ноль, например? Т. е. если я напишу в теле функции деление на переменную без проверки, заругается компилятор или нет? Если нет - что будет, если в процессе выполнения кода деление на 0 все-таки произойдет?
554
31 октября 2005 года
Zhilin Mike
159 / / 11.02.2003
Цитата:
Originally posted by Freeman
Вопрос, скорее, по стандарту языка Java и его реализации. Как-то пытался изучать Java и помню, что исключения являются частью декларации функции, т. е. указывается, какие конкретно исключения можно от нее ожидать.

Внимание, вопрос! :) Как это контролируется компилятором? Ведь исключения могут вызывать не только пользовательские или библиотечные процедуры, но и процессор, например. Если AV не может возникнуть - в Java нет адресов и адресной арифметики, то как быть с делением на ноль, например? Т. е. если я напишу в теле функции деление на переменную без проверки, заругается компилятор или нет? Если нет - что будет, если в процессе выполнения кода деление на 0 все-таки произойдет?



Вылетит эксепшен. Компилятор при компиляции лишь проверяет что если в коду будет вылетать throw new хххException , то он обязательно должен быть обработан одной из функции,которые в результате вызова которых и произошел эксепшен. Короче если ты сделал несколько подвызовов и внутри их произошел эксепшен, то необходимо его обработать.

Насчет деления на ноль, то здесь очень просто. Это действие не требует обязательной обработки, оно будет словлено виртуальной машиной. вылетит так сказать runtime error =). Вот так.

291
31 октября 2005 года
gufy
703 / / 08.01.2003
все верно. для большей ясности процитирую один из манов:

Цитата:
Дело в том, что спецификация JLS делит все исключения на проверяемые (checked), те, которые проверяет компилятор, и непроверяемые (unchecked). При проверке компилятор замечает необработанные в методах и конструкторах исключения и считает ошибкой отсутствие в заголовке таких методов и конструкторов пометки throws.
Так вот, исключения класса RuntimeException и его подклассов, одним из которых является ArithmeticException, непроверяемые, для них пометка throws необязательна. Еще одно большое семейство непроверяемых исключений составляет класс Error и его расширения.

Почему компилятор не проверяет эти типы исключений? Причина в том, что исключения класса RuntimeException свидетельствуют об ошибках в программе, и единственно разумный метод их обработки — исправить исходный текст программы и перекомпилировать ее. Что касается класса Error, то эти исключения очень трудно локализовать и на стадии компиляции невозможно определить место их появления.

Напротив, возникновение проверяемого исключения показывает, что программа недостаточно продумана, не все возможные ситуации описаны. Такая программа должна быть доработана, о чем и напоминает компилятор.

10
31 октября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by gufy
Дело в том, что спецификация JLS делит все исключения на проверяемые (checked), те, которые проверяет компилятор, и непроверяемые (unchecked). При проверке компилятор замечает необработанные в методах и конструкторах исключения и считает ошибкой отсутствие в заголовке таких методов и конструкторов пометки throws.


Спасибо, становится теплее. Я тут первоисточник изучать пытаюсь, то бишь Оберон. Вот и хочется понять: программирование без исключений - монастырь, или действительно можно без них обойтись.

831
01 ноября 2005 года
S_T
117 / / 23.10.2002
Цитата:
Originally posted by Zhilin Mike
Вылетит эксепшен. Компилятор при компиляции лишь проверяет что если в коду будет вылетать throw new хххException , то он обязательно должен быть обработан одной из функции,которые в результате вызова которых и произошел эксепшен. Короче если ты сделал несколько подвызовов и внутри их произошел эксепшен, то необходимо его обработать.

Насчет деления на ноль, то здесь очень просто. Это действие не требует обязательной обработки, оно будет словлено виртуальной машиной. вылетит так сказать runtime error =). Вот так.



Не совсем верно. Напишите в теле функции

 
Код:
throw new NullPointerException()


В этом случае компилятор не потребует ни для самой функции определять суффикс throws NullPointerException. Ни для вызывающей ее функции сделать блок try ... catch

Так что смотрите пост про checked и unchecked исключения.
554
01 ноября 2005 года
Zhilin Mike
159 / / 11.02.2003
Цитата:
Originally posted by S_T
Не совсем верно. Напишите в теле функции
 
Код:
throw new NullPointerException()


В этом случае компилятор не потребует ни для самой функции определять суффикс throws NullPointerException. Ни для вызывающей ее функции сделать блок try ... catch

Так что смотрите пост про checked и unchecked исключения.



Ну да... Как бы оно будет словлено компилятором. Как и деление на нуль. Просто по философии эти эксепшены просходят в основном так сказать не зависимо от нас. Поэтому все они должны быть обработаны машиной.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог