АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
Сцепленные исключенияНачиная с J2SE 1.4, в подсистему исключений было добавлено новое средство: сцепленные исключения (chained exceptions). Это средство позволяет ассоциировать с одним исключением другое исключение. Второе исключение описывает причину появления первого. Например, представьте ситуацию, когда метод возбуждает исключение ArithmeticException, поскольку была предпринята попытка деления на ноль. Однако реальная причина проблемы заключается в ошибке ввода-вывода, что приводит к неправильному делению. И хотя метод должен возбуждать ArithmeticException, так как произошла именно эта ошибка, вы можете также позволить вызывающему коду узнать о том, что в основе лежит ошибка ввода-вывода. Сцепленные исключения позволяют справиться с этой, а также с любой другой ситуацией, в которой присутствуют уровни исключений. Чтобы разрешить сцепленные исключения, были добавлены два конструктора и два метода к Throwable. // Демонстрация сцепленных исключений. class ChainExcDemo { static void demoproc() { // создать исключение NullPointerException e = new NullPointerException("верхний уровень"); // добавить причину e.initCause(new ArithmeticException("причина")); throw e; } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e) { BookNew_JAVA-7.indb 250 02.06.2007 1:07:00 Глава 10. Обработка исключений 251 // отобразить исключение верхнего уровня System.out.println("Перехвачено: " + e); // отобразить исключение-причину System.out.println("Исходная причина: " + e.getCause()); } }} Эта программа создает следующий вывод: Перехвачено: java.lang.NullPointerException: верхний уровень Исходная причина: java.lang.ArithmeticException: причина В этом примере исключением верхнего уровня является NullPointerException. К нему добавлено исключение-причина – ArithmeticException. Когда исключение возбуждается из demoproc(), оно перехватывается в main(). Затем исключение верхнего уровня отображается, а за ним следует исключение, лежащее в основе, которое извлекается методом getCause(). Сцепленные исключения могут вкладываться на любую глубину. То есть исключениепричина может иметь собственную причину. Но имейте в виду, что слишком длинные цепочки сцепленных исключений, скорее всего, свидетельствуют о плохом дизайне. Сцепленные исключения не являются вещью, совершенно необходимой в каждой программе. Однако в случаях, когда информация об исключении-причине таки нужна, они представляют собой элегантное решение. Потоки данных в JavaКак вы могли заметить, до сих пор в примерах программ было задействовано не так много операций ввода-вывода. Фактически помимо print() и println(), никаких методов ввода-вывода в общем-то и не применялось. Причина этого проста: большинство реальных Java-приложений не являются текст-ориентированными консольными программами. Вместо этого они являются графически-ориентированными программами, которые основаны на Abstract Window Toolkit (AWT) или Swing для взаимодействия с пользователем. Хотя текст-ориентированные программы великолепны в качестве учебных примеров, они не занимают сколько-нибудь значительную часть в мире реальных программ. К тому же поддержка консольного ввода-вывода в Java ограничена и не слишком удобна в использовании — даже для простейших программ. Текстовый консольный ввод-вывод не является важным при программировании на Java. Тем не менее, Java обеспечивает мощную и гибкую поддержку ввода-вывода, когда это касается файлов и сетей. Система ввода-вывода Java целостна и последовательна. Фактически, если однажды разобраться с ее базовыми принципами, все остальное для профессионала становится простым. ПотокиJava-программы создают потоки ввода-вывода. Поток (stream) — это абстракция, которая либо порождает, либо принимает информацию. Поток связан с физическим устройством с помощью системы ввода-вывода Java. Все потоки ведут себя на один манер, даже несмотря на то, что реальные физические устройства, к которым они подключены, отличаются друг от друга. Таким образом, одни и те же классы и методы ввода-вывода применимы к устройствам разного типа. Аналогично выходной поток может ссылаться на консоль, дисковый файл или сетевое подключение. Потоки — это ясный способ обращения с вводом-выводом без необходимости для вашего кода разбираться с разницей, например, между клавиатурой и сетью. Java реализует потоки внутри иерархии классов, определенных в пакете java.io. |