a2e98898

Создайте трехуровневую иерархию исключений. Теперь


  • Создайте трехуровневую иерархию исключений. Теперь создайте базовый класс 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++ деструктор должен это обрабатывать за вас.

  • Начиная с раздела 4 IOStreamDemo.java, напишите программу, которая сравнивает производительность записи файла при использовании буферизации и без нее при вводе/выводе.

  • Измените раздел IOStreamDemo.java, чтобы подавить появление пробелов в строках, производимых первым вызовом in5br.readLine( ). Сделайте это, используя цикл while и readChar( ).



  • Восстановите программу CADState.java, как описано в тексте.
  • В Blips.java, скопируйте файл и переименуйте его в BlipCheck.java, затем переименуйте класс Blip2 в BlipCheck (сделав его public и удалив публичный код из класса Blips). Удалите маркер //! в файле и выполните программу, включая раздражающие строки. Далее, закомментируйте конструктор по умолчанию для BlipCheck. Запустите программу и объясните почему она работает. Обратите внимание, что после компиляции вы должны выполнить программу с помощью строки “java Blips”, потому что метод main( ) все еще находится в классе Blips.
  • В Blip3.java, закомментируйте две строки после фразы “Вы обязаны сделать это:” и запустите программу. Объясните результат и почему он отличается от того, когда эти две строки присутствуют в программе.
  • (Промежуточное) В Главе 8 найдите пример GreenhouseControls.java, который состоит из трех файлов. В GreenhouseControls.java внутренний класс Restart( ) имеет жестко привязанный набор событий. Измените программу так, чтобы она читала события и относительное время из текстового файла. (Рекомендация: Используйте шаблон разработки метода производства для построения событий — Смотрите Thinking in Patterns with Java, доступную на www.BruceEckel.com.)

  • [57] Design Patterns, Erich Gamma et al., Addison-Wesley 1995.
    [58] XML является другим способом решения проблемы перемещения данных между различными платформами, которая не зависит от того, есть ли Java на всех платформах. Однако инструментарий Java поддерживает XML.
    [59] Глава 13 покажет даже более последовательное решение этого: GUI программу со скроллируемой текстовой областью.
    [ Предыдущая глава ] [ Оглавление ] [ Содержание ] [ Индекс ] [ Следующая глава ]


  • Реализуйте метод rotate(Shape) описанный в этой главе, как тот, который проверяет, поворачивается ли Circle.

  • Измените Упражнение 6 для использования рефлексии вместо RTTI.

  • Измените Упражнение 7 для использования рефлексии вместо RTTI.

  • В ToyTest.java, используйте рефлексию для создания объекта Toy с помощью конструктора не по умолчанию.

  • Поищите интерфейс для java.lang.Class в HTML Java документации на java.sun.com. Напишите программу, которая берет имя класса из аргумента командной строки, затем использует методы объекта Class для выдачи всей информации, доступной для этого класса. Проверьте Вашу программу на стандартной библиотеке классов и на классах, которые создаете Вы сами.

  • [60] Особенно раньше. Однако, Sun сильно улучшила HTML Java документацию так что она сейчас намного проще для поиска методов базового класса.
    [ Предыдущая глава ] [ Оглавление ] [ Содержание ] [ Индекс ] [ Следующая глава ]

    Содержание раздела