Java: руководство для начинающих
Шрифт:
Исключение QueueFullException генерируется при попытке поместить элемент в уже заполненную очередь, а исключение QueueEmptyException — в ответ на попытку извлечь элемент из пустой очереди.
Измените класс FixedQueue таким образом, чтобы при возникновении ошибки он генерировал исключение. Соответствующий код приведен ниже. Введите этот код в файл QExcDemo.java. // Класс, реализующий очередь фиксированного размера // для хранения символов. class FixedQueue implements ICharQ { private char q[]; // Массив для хранения элементов очереди, private int putloc, getloc; // Индексы размещения и извлечения // элементов очереди. // создать пустую очередь заданного размера public FixedQueue(int size) { q = new char[size+1]; //
Добавление исключений в класс FixedQueue выполняется в два этапа. Сначала в определении методов get и put указывается оператор throws с типом генерируемого исключения. А затем в этих методах организуется генерирование исключений при возникновении ошибок. Используя исключения, можно организовать обработку ошибок в вызывающей части программы наиболее рациональным способом. Как вы помните, в предыдущих версиях рассматриваемой здесь программы выводились только сообщения об ошибках. А генерирование исключений является более профессиональным подходом к разработке данной программы.
Для опробования усовершенствованного класса FixedQueue введите в файл QExcDemo.java приведенный ниже исходный код класса QExcDemo. // Демонстрация исключений при обращении с очередью, class QExcDemo { public static void main(String args[]) { FixedQueue q = new FixedQueue(10); char ch; int i; try { // Переполнение очереди. for(i=0; i < 11; i++) { System.out.print("Attempting to store : " + (char) ('A' + i)); q.put((char) (fA' + i)); System.out.println(" - OK"); } System.out.println; } catch (QueueFullException exc) { System.out.println(exc); } System.out.println; try { // Попытка извлечь символ из пустой очереди. for(i=0; i < 11; i++) { System.out.print("Getting next char: "); ch = q.get; System.out.println(ch); } } catch (QueueEmptyException exc) { System.out.println(exc); } } }
Класс FixedQueue реализует интерфейс ICharQ, в котором определены методы get и put , и поэтому интерфейс ICharQ необходимо изменить таким образом, чтобы в нем отражалось наличие операторов throws. Ниже приведен видоизмененный соответственно код интерфейса ICharQ. Не забывайте о том, что он должен храниться в файле ICharQjava. // Интерфейс очереди для хранения символов с генерированием исключений, public interface ICharQ { // поместить символ в очередь void put(char ch) throws QueueFullException; // извлечь символ из очереди char get throws QueueEmptyException; }
Скомпилируйте сначала новую версию исходного файла IQChar. j ava, а затем исходный файл QExcDemo. java и запустите программу QExcDemo на выполнение. В итоге вы получите следующий результат ее выполнения: Attempting to store A - OK Attempting to store В - OK Attempting to store С - OK Attempting to store D - OK Attempting to store E - OK Attempting to store F - OK Attempting to store G - OK Attempting to store H - OK Attempting to store I - OK Attempting to store J - OK Attempting to store К Queue is full. Maximum size is 10 Getting next char: A Getting next char: В Getting next char: С Getting next char: D Getting next char: E Getting next char: F Getting next char: G Getting next char: H Getting next char: I Getting next char: J Getting next char: Queue is empty. Упражнение для самопроверки по материалу главы 9
Какой класс находится на вершине иерархии исключений?
Объясните вкратце, как пользоваться ключевыми словами try и catch?
Какая ошибка допущена в приведенном ниже фрагменте кода?// ... vals[18] = 10; catch (ArraylndexOutOfBoundsException exc) { // обработать ошибку }
Что произойдет, если исключение не будет перехвачено?
Какая ошибка допущена в приведенном ниже фрагменте кода?class A extends Exception { ... class В extends А { ... // ... try { // ... } catch (A exc) { ... } catch (В exc) { ... }
Может ли внутренний блок catch повторно генерировать исключение, которое будет обработано во внешнем блоке catch?
Блок finally — последний фрагмент кода, выполняемый перед завершением программы. Верно или неверно? Обоснуйте свой ответ.
Исключения какого типа необходимо явно объявлять с помощью оператора throws, включаемого в объявление метода?
Какая ошибка допущена в приведенном ниже фрагменте кода?class MyClass { // ... } // ... throw new MyClass ;
Отвечая на вопрос 3 упражнения для самопроверки по материалу главы 6, вы создали класс Stack. Добавьте в него специальные исключения для реагирования на попытку поместить элемент в переполненный стек и извлечь элемент из пустого стека.
Какими тремя способами можно сгенерировать исключение?
Назовите два подкласса, производных непосредственно от класса Throwable.
Что такое многократный перехват?
Следует ли перехватывать в программе исключения типа Error?
Глава 10 Ввод-вывод данных
Основные навыки и понятия
Представление о потоках ввода-вывода
Отличия байтовых и символьных потоков
Классы для поддержки байтовых потоков
Классы для поддержки символьных потоков
Представление о встроенных потоках
Применение байтовых потоков
Использование байтовых потоков для файлового ввода-вывода
Автоматическое закрытие файлов с помощью оператора try с ресурсами
Чтение и запись двоичных данных
Манипулирование файлами с произвольным доступом
Применение символьных потоков
Использование символьных потоков для файлового ввода-вывода
Применение оболочек типов Java для преобразования символьных строк в числа
В примерах программ, приводившихся в предыдущих главах, уже применялись отдельные части системы ввода-вывода в Java, в частности метод println , но делалось это без каких-либо формальных пояснений. Система ввода-вывода основана в Java на иерархии классов, поэтому ее функции и особенности нельзя было представлять до тех пор, пока не были рассмотрены классы, наследование и исключения. А теперь настал черед и для средств ввода-вывода.
Приступая к изучению системы ввода вырода Java, приготовьтесь к длительной и кропотливой работе. Система ввода-вывода в Java довольно обширна и содержит немало классов, интерфейсов и методов. Объясняется это, в частности, тем, что в Java, по существу, определены две полноценные системы ввода-вывода: одна — для обмена байтами, другая — для обмена символами. Здесь нет возможности рассмотреть все аспекты ввода-вывода в Java, ведь для этого бы потребовалась отдельная книга. Поэтому в данной главе будут рассмотрены лишь наиболее важные и часто используемые языковые средства ввода-вывода. Правда, элементы системы ввода-вывода в Java тесно взаимосвязаны, и поэтому, уяснив основы, вы легко освоите все остальные свойства этой системы.