Страница 127 из 133
“Один интерфейс — множество методов” — главный принцип Java. Какое языковоесредство лучше всего демонстрирует этот принцип?Этот принцип объектно-ориентированного программирования лучше всего демонстрирует интерфейс.
Сколько классов могут реализовать один и тот же интерфейс? Сколько интерфейсовможет реализовать класс?Один интерфейс может быть реализован любым количеством классов. Класс можетреализовать произвольное число интерфейсов.
Может ли один интерфейс наследовать другой интерфейс?Да, может. Механизм наследования распространяется и на интерфейсы.
Создайте интерфейс для класса Vehicle, рассмотренного в главе 7, назвав егоIVehicle.interface IVehicle {// возвратить дальность действия транспортного средстваint range();// рассчитать объем топлива, требующегося// для прохождения заданного путиdouble fuelneeded(int miles);// Методы доступа к переменным экземпляра.int getPassengers();void setPassengers(int p);int getFuelcap();void setFuelcap(int f);int getMpg();void setMpg(int m);}
Переменные, объявленные в интерфейсе, неявно считаются как static и final.Какие преимущества это дает?Переменные, объявленные в интерфейсе, могут служить в качестве именованныхконстант, общих для всех файлов программы. Доступ к ним обеспечивается путемимпорта того интерфейса, в котором они объявлены.
Пакет, по существу, является контейнером для классов. Верно или не верно?Приложение А. Ответы на вопросы для самопроверки 575Верно.
Какой стандартный пакет импортируется по умолчанию в любую программу на Java?Пакет java.lang.Глава 9. Обработка исключений
Какой класс находится на вершине иерархии исключений?На вершине иерархии исключений находится класс 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 объявляются все исключения, кроме RuntimeException и 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.");}}}}