Какой класс находится на вершине иерархии исключений? На вершине иерархии исключений находится класс Throwable.
Объясните вкратце, как пользоваться ключевыми словами try и catch? Ключевые слова try и catch используются совместно. Операторы программы для отслеживания исключений помещаются в блок try. А перехват и обработка исключений осуществляются в блоке catch.
Какая ошибка допущена в приведенном ниже фрагменте кода? II ... vals[18] = 10; catch (ArraylndexOutOfBoundsException exc) { // обработать ошибку } Блоку catch не предшествует блок try.
Что произойдет, если исключение не будет перехвачено? Если исключение не будет перехвачено, произойдет аварийное завершение программы.
Какая ошибка допущена в приведенном ниже фрагменте кода? class A extends Exception { ... class В extends А { ... II ... try { II ... } catch (A exc) { ... } catch (B exc) { ... } В данном фрагменте кода оператор catch для суперкласса предшествует оператору catch для подкласса. А поскольку оператор catch для суперкласса может обработать также исключения, относящиеся к подклассу, то в программе окажется код, недоступный для выполнения.
Может ли внутренний блок catch повторно генерировать исключение, которое будет обработано во внешнем блоке catch? Да, исключения могут генерироваться повторно.
Блок finally — последний фрагмент кода, выполняемый перед завершением программы. Верно или неверно? Обоснуйте свой ответ. Неверно. Блок finally выполняется по завершении блока try.
Исключения какого типа необходимо явно объявлять с помощью оператора throws, включаемого в объявление метода? С помощью оператора throws объявляются все исключения, кроме Runtime Exception и Error.
Какая ошибка допущена в приведенном ниже фрагменте кода? class MyClass { // ... } // ... throw new MyClass(); Класс MyClass не является производным от класса Throwable. С помощью оператора throw могут генерироваться лишь те исключения, которые являются подклассами, производными от класса Throwable.
Отвечая на вопрос 3 упражнения для самопроверки по материалу главы 6, вы создали класс Stack. Добавьте в него специальные исключения для реагирования на попытку поместить элемент в переполненный стек и извлечь элемент из пустого стека. // Исключение, возникающее при переполнении стека, class StackFullException extends Exception { int size; StackFullException (int s) { size = s; } public String toString() { return "\nStack is full. Maximum size is " + size; } } // Исключение, возникающее при обращении к пустому стеку, class StackEmptyException extends Exception { public String toString () { return "\nStack is empty."; } } // Класс, реализующий стек для хранения символов, class Stack { private char stck[]; // Массив для хранения элементов стека private int tos; // Вершина стека // построить пустой стек заданного размера Stack(int size) { stck = new char[size]; // выделить память для стека tos = 0; } // построить один стек из другого стека Stack(Stack ob) { tos = ob.tos; stck = new char[ob.stck.length]; Приложение А. Ответы на вопросы для самопроверки 577 // скопировать элементы for(int i=0; i < tos; i++) stck[i] = ob.stck[i]; } // построить стек с исходными значениями Stack(char а [ ]) { stck = new char[a.length]; for(int i = 0; i < a.length; i++) { try { push (a [i]); } catch(StackFullException exc) { System.out.println(exc); } } } // поместить символы в стек void push(char ch) throws StackFullException { if(tos==stck.length) throw new StackFullException(stck.length); stck[tos] = ch; tos++; } // извлечь символы из стека char pop() throws StackEmptyException { if(tos==0) throw new StackEmptyException(); tos — ; return stck[tos]; } }
Какими тремя способами можно сгенерировать исключение? Исключение может быть сгенерировано в результате ошибки в виртуальной машине Java, ошибки в программе или явным образом с помощью оператора throw.
Назовите два подкласса, производных непосредственно от класса Throwable. Классы Error и Exception
Что такое многократный перехват? Многократным называется такой перехват, который позволяет перехватывать два и больше исключений одним оператором catch.
Следует ли перехватывать в программе исключения типа Error? Нет, не следует. Глава 10. Ввод-вывод данных
Для чего в Java определены как байтовые, так и символьные потоки? Байтовые потоки с самого начала были определены в Java. Они особенно удобны для ввода-вывода двоичных данных и поддерживают произвольный доступ к ним в файлах. А символьные потоки оптимизированы для представления в уникоде.
Как известно, ввод-вывод данных на консоль осуществляется в текстовом виде. Почему же в Java для этой цели используются байтовые потоки? Стандартные потоки ввода-вывода System, in, System.out и System.err были определены в Java прежде символьных потоков.
Как открыть файл для чтения байтов? Ниже приведен один из способов открытия файла для ввода данных типа byte. FilelnputStream fin = new FilelnputStream("test");
Как открыть файл для чтения символов? Ниже приведен один из способов открытия файла для ввода символов. FileReader fr = new FileReader("test");
Как открыть файл для ввода-вывода с произвольным доступом? Ниже приведен один из способов открытия файла для ввода-вывода с произвольным доступом. randfile = new RandomAccessFile("test", "rw");
Как преобразовать числовую строку "123.23" в двоичный эквивалент? Для того чтобы преобразовать числовую строку в двоичный эквивалент, следует воспользоваться одним из методов синтаксического анализа, определенных в классах оболочек типов, например Integer или Double.
Напишите программу, которая будет копировать текстовые файлы. Видоизмените ее таким образом, чтобы все пробелы заменялись дефисами. Используйте при написании программы классы, представляющие байтовые потоки, а также традиционный способ закрытия файла явным вызовом метода close (). / Копирование текстового файла с заменой пробелов дефисами. В этой версии программы используются байтовые потоки. Для того чтобы воспользоваться этой программой, укажите в командной строке имена исходного и целевого файлов. Например: java Hyphen source target / import java.io.*; class Hyphen { public static void main(String args[]) { int i; FilelnputStream fin = null; FileOutputStream fout = null; Приложение А. Ответы на вопросы для самопроверки 579 // проверить сначала, указаны ли оба файла if(args.length !=2 ) { System.out.println("Usage: Hyphen From To"); return; } // скопировать файл и заменить в нем пробелы дефисами try { fin = new FilelnputStream(args[0]); fout = new FileOutputStream(args[1]); do { i = fin.read(); // преобразовать пробел в дефис if((char)i == ' ') i = if(i != -1) fout.write(i); } while(i != -1); } catch(IOException exc) { System.out.println("I/O Error: " + exc); } finally { try { if (fin != null) fin.closeO; } catch(IOException exc) { System.out.println("Error closing input file."); } try { if(fin != null) fout.close(); } catch(IOException exc) { System.out.println("Error closing output file."); } } } }
Перепишите программу, созданную в ответ на предыдущий вопрос, таким образом, чтобы в ней использовались классы, представляющие символьные потоки. На этот раз воспользуйтесь оператором try с ресурсами для автоматического закрытия файла. /* Копирование текстового файла с заменой пробелов дефисами. В этой версии программы используются символьные потоки. Для того чтобы воспользоваться этой программой, укажите в командной строке имена исходного и целевого файлов. Например: java Hyphen2 source target Для компиляции этого кода требуется JDK 7
или более поздняя версия данного комплекта. / import java.io.; class Hyphen2 { public static void main(String args[]) throws IOException { int i; // проверить сначала, указаны ли оба файла if(args.length !=2 ) { System.out.println("Usage: CopyFile From To"); return; } // скопировать файл и заменить в нем пробелы дефисами, // используя оператор try с ресурсами try (FileReader fin = new FileReader(args[0]); FileWriter fout = new FileWriter(args[1])) { do { i = fin.read(); // преобразовать пробел в дефис if((char)i == • ') i = if(i != -1) fout.write(i); } while(i != —1); } catch(IOException exc) { System.out.println("I/O Error: " + exc); } } }
К какому типу относится поток System. in? К типу InputStream.
Что возвращает метод read () из класса InputStream по достижении конца потока? Значение -1.
Поток какого типа используется для чтения двоичных данных? Поток типа DatalnputStream.
Классы Reader и Writer находятся на вершине иерархии классов символьного ввода-вывода
Оператор try без ресурсов служит для . автоматического управления ресурсами
Если для закрытия файла используется традиционный способ, то это лучше всего делать в блоке finally. Верно или неверно? Верно. Глава 11. Многопоточное программирование