Философия Java


Упражнения - часть 2


  • Создайте трехуровневую иерархию исключений. Теперь создайте базовый класс A, с методом, который выбрасывает исключение базового класса вашей иерархии. Наследуйте B от A и перегрузите метод так, чтобы он выбрасывал исключение второго уровня в вашей иерархии. Повторите то же самое, унаследовав класс C от B. В main( ) создайте C и приведите его к A, затем вызовите метод.
  • Покажите, что конструктор наследуемого класса не может ловить исключения, брошенные конструктором базового класса.
  • Покажите, что OnOffSwitch.java может завершиться неудачей при выбрасывании RuntimeException внутри блока try.
  • Покажите, что WithFinally.java не завершится неудачей при выбрасывании RuntimeException в блоке try.
  • Измените Упражнение 6, добавив предложение finally. Проверьте, что предложение finally выполняется даже, если выбрасывается NullPointerException.
  • Создайте пример, в котором вы используете флаг для управления вызовом кода очистки, как описано во втором параграфе под заголовком “Конструкторы”.
  • Измените StormyInning.java, добавив тип исключения UmpireArgument и метод, который его выбрасывает. Проверьте измененную иерархию.
  • Удалите первый catch в Human.java и проверьте, что код все равно компилируется и правильно работает.
  • Добавьте второй уровень потерь исключения в LostMessage.java, так чтобы HoHumException заменялось третьим исключением.
  • В Главе 5 найдите две программы, называемые Assert.java и измените их, чтобы они выбрасывали свои собственные исключения вместо печать в System.err. Это исключение должно быть внутренним классом, расширяющим RuntimeException.
  • Добавьте подходящий набор исключений в c08:GreenhouseControls.java.
  • [51] C программист может посмотреть на возвращаемое значение printf( ), как пример этого.

    [52] Это значительное улучшение, по сравнению с обработкой исключений в C++, которая не ловит нарушения спецификации исключений до времени выполнения, хотя это не очень полезно.

    [53] Обработка исключений в C++ не имеет предложения finally, поэтому в C++ освобождение происходит в деструкторах, чтобы завершить такой род очистки.

    [54] Деструктор - это функция, которая всегда вызывается, когда объект более не используется. Вы всегда знаете точно, где совершен вызов деструктора. C++ имеет автоматический вызов деструктора, но Object Pascal из Delphi версии 1 и 2 не делает этого (что изменяет значение и использование концепции деструкторов в этом языке).

    [55] ISO C++ добавил сходное ограничение, которое требует, чтобы исключение наследуемого метода были теми же или наследовались от тех же, что и выбрасываемые методом базового класса. Это первый случай, в котором C++ реально способен проверить спецификацию исключений во время компиляции.

    [56] В C++ деструктор должен это обрабатывать за вас.

    [ Предыдущая глава ] [ Оглавление ] [ Содержание ] [ Индекс ] [ Следующая глава ]




    Начало  Назад  Вперед