- •724 Содержание
- •Глава 6. Интерфейсы и внутренние классы 139
- •У казания и ответы
- •Вопрос 3.2.
- •Вопрос 8.2.
- •Вопрос 8.3.
- •Вопрос 14.2.
- •Вопрос 21.5.
- •Ч асть 1. Основы языка java
- •Глава 1 введение в классы и объекты Основные понятия ооп
- •Язык Java
- •Нововведения версий 5.0 и 6.0
- •Простое приложение
- •Классы и объекты
- •Сравнение объектов
- •Консоль
- •Простой апплет
- •Задания к главе 1 Вариант a
- •Вариант b
- •Тестовые задания к главе 1
- •Вопрос 1.5.
- •Г лава 2 типы данных и операторы
- •Базовые типы данных и литералы
- •Документирование кода
- •Операторы
- •Классы-оболочки
- •Операторы управления
- •Массивы
- •Класс Маth
- •Управление приложением
- •Задания к главе 2 Вариант a
- •Вариант в
- •Тестовые задания к главе 2
- •Переменные класса и константы
- •Ограничение доступа
- •Конструкторы
- •Статические методы и поля
- •Модификатор final
- •Абстрактные методы
- •Модификатор native
- •Модификатор synchronized
- •Логические блоки
- •Перегрузка методов
- •Параметризованные классы
- •Параметризованные методы
- •Методы с переменным числом параметров
- •Перечисления
- •1 : Fpmi : Балаганов
- •Аннотации
- •Задания к главе 3 Вариант a
- •Вариант b
- •Тестовые задания к главе 3
- •Использование final
- •Использование super и this
- •Переопределение методов и полиморфизм
- •Методы подставки
- •Полиморфизм и расширяемость
- •Статические методы и полиморфизм
- •Абстракция и абстрактные классы
- •Класс Object
- •Клонирование объектов
- •“Сборка мусора” и освобождение ресурсов
- •Задания к главе 4 Вариант a
- •Вариант в
- •Тестовые задания к главе 4
- •Вопрос 4.7.
- •Г лава 5 проектирование классов Шаблоны проектирования grasp
- •Шаблон Expert
- •Шаблон Creator
- •Шаблон Low Coupling
- •Шаблон High Cohesion
- •Шаблон Controller
- •Шаблоны проектирования GoF
- •Порождающие шаблоны
- •К порождающим шаблонам относятся:
- •Шаблон Factory
- •Шаблон AbstractFactory
- •Шаблон Builder
- •Шаблон Singleton
- •Структурные шаблоны
- •К структурным шаблонам относятся:
- •Шаблон Bridge
- •Шаблон Decorator
- •Шаблоны поведения
- •К шаблонам поведения относятся:
- •Шаблон Command
- •Шаблон Strategy
- •Шаблон Observer
- •Тестовые задания к главе 5
- •Статический импорт
- •Внутренние классы
- •Внутренние (inner) классы
- •Вложенные (nested) классы
- •Анонимные (anonymous) классы
- •Задания к главе 6 Вариант а
- •Вариант b
- •Вариант c
- •Тестовые задания к главе 6
- •Вопрос 6.5.
- •Класс String
- •Классы StringBuilder и StringBuffer
- •Форматирование строк
- •Лексический анализ текста
- •Регулярные выражения
- •Интернационализация текста
- •Интернационализация чисел
- •Интернационализация дат
- •3 Апрель 2006 г.
- •Задания к главе 7 Вариант a
- •Вариант b
- •Тестовые задания к главе 7
- •Оператор throw
- •Ключевое слово finally
- •Собственные исключения
- •Наследование и исключения
- •Отладочный механизм assertion
- •Задания к главе 8
- •Байтовые и символьные потоки ввода/вывода
- •Предопределенные потоки
- •Сериализация объектов
- •Консоль
- •Класс Scanner
- •Архивация
- •Задания к главе 9 Вариант a
- •Вариант b
- •Вариант с
- •Тестовые задания к главе 9
- •Множества
- •Карты отображений
- •14El - найден по ключу '12'
- •Унаследованные коллекции
- •Класс Collections
- •Класс Arrays
- •Задания к главе 10 Вариант a
- •Вариант b
- •Тестовые задания к главе 10
- •Апплеты
- •Задания к главе 11
- •Тестовые задания к главе 11
- •Классы-адаптеры
- •Задания к главе 12
- •Тестовые задания к главе 12 Вопрос 12.1.
- •Вопрос 12.2.
- •Вопрос 12.3.
- •Вопрос 12.4.
- •Вопрос 12.5.
- •Г лава 13 элементы компоновки и управления
- •Менеджеры размещения
- •Элементы управления
- •Визуальные компоненты JavaBeans
- •Задания к главе 13 Вариант а
- •Вариант b
- •Жизненный цикл потока
- •Управление приоритетами и группы потоков
- •Управление потоками
- •Потоки-демоны
- •Потоки в графических приложениях
- •Методы synchronized
- •Инструкция synchronized
- •Состояния потока
- •Потоки в j2se 5
- •Задания к главе 14 Вариант а
- •Вариант b
- •Тестовые задания к главе 14
- •Вопрос 14.1.
- •Вопрос 14.2.
- •Вопрос 14.3.
- •Вопрос 14.4.
- •Вопрос 14.5.
- •Г лава 15 сетевые программы Поддержка Интернет
- •Сокетные соединения по протоколу tcp/ip
- •Многопоточность
- •Датаграммы и протокол udp
- •Задания к главе 15 Вариант а
- •Вариант b
- •Древовидная модель
- •Элементы таблицы стилей
- •Задания к главе 16 Вариант а
- •Тестовые задания к главе 16
- •Запуск контейнера сервлетов и размещение проекта
- •Первая jsp
- •Взаимодействие сервлета и jsp
- •Задания к главе 17 Вариант а
- •Вариант b
- •Интерфейс ServletContext
- •Интерфейс ServletConfig
- •Интерфейсы ServletRequest и HttpServletRequest
- •Интерфейсы ServletResponse и HttpServletResponse
- •Обработка запроса
- •Многопоточность
- •Электронная почта
- •Задания к главе 18 Вариант а
- •Вариант b
- •Стандартные элементы action
- •Неявные объекты
- •Демонстрация работы тегов c:forEach, c:choose, c:when, c:otherwise
- •Данная страница демонстрирует работу тегов
- •Включение ресурсов
- •Обработка ошибок
- •Технология взаимодействия jsp и сервлета
- •Задания к главе 19
- •Вариант а
- •Вариант b
- •Субд MySql
- •Простое соединение и простой запрос
- •Метаданные
- •Подготовленные запросы и хранимые процедуры
- •Транзакции
- •Id студента: 83, Petrov Внесены данные в students: 83, Petrov Внесены данные в course: 83, xml Данные внесены - транзакция завершена
- •Точки сохранения
- •Пул соединений
- •Задания к главе 20 Вариант а
- •Вариант b
- •Обработка событий
- •Фильтры
- •Задания к главе 21 Вариант а
- •Вариант b
- •Вопрос 21.5.
- •Вопрос 21.6.
- •Г лава22 пользовательские теги
- •Простой тег
- •Тег с атрибутами
- •Тег с телом
- •Элементы action
- •Задания к главе 22 Вариант а
- •Вариант b
- •П риложение 2
- •Включение скриптов на языке JavaScript в html-код
- •Отладка скриптов JavaScript
- •Типы данных
- •Специальные числа
- •Булев тип
- •Переменные типа Undefined и Null
- •Массивы
- •Операторы и выражения
- •Оператор with
- •Оператор switch
- •Метод eval()
- •Функции
- •Передача параметров по значению и по ссылке
- •Глобальные и локальные переменные
- •Пользовательские объекты
- •Прототипы
- •Встроенные объекты Array, Date, Math Объект Array
- •Объект Date
- •Объект Math
- •Объекты window и document
- •Создание новых узлов
- •Добавление новых узлов в документ
- •Удаление и замена узлов в документе
- •Использование каскадных таблиц стилей в dom
- •Свойство элемента innerHtml и outerHtml
- •Динамическое назначение событий
- •Ключевое слово this
- •П риложение3
- •Проектная модель
- •Uml как программный язык
- •Нотации и метамодель
- •Диаграммы, которые ниже будут рассмотрены с разной степенью детализации:
- •Свойства
- •Множественность
- •Операторы
- •П риложение 4 базы данных и язык sql
- •Реляционные субд Модель данных в реляционных субд
- •Нормализация модели данных
- •Язык sql
- •Команды sql
- •Команды определения структуры данных (DataDefinitionLanguage–ddl)
- •Команды манипулирования данными (Data Manipulation Language – dml)
- •Команды управления транзакциями (TransactionControlLanguage–tcl)
- •Команды управления доступом (DataControlLanguage–dcl)
- •Работа с командами sql
- •Ключевое слово distinct
- •Секция from, логическое связывание таблиц
- •Секция where
- •Секция orderby
- •Групповые функции
- •Секция group by
- •Секция having
- •Изменение данных
- •Команда insert
- •Команда delete
- •Команда update
- •Определение структуры данных Команда createtable
- •Команда droptable
- •П риложение5
- •П риложение 6
- •П риложение7 журнал сообщений (logger)
- •П риложение 8
- •Портлеты
Тестовые задания к главе 7
Вопрос 7.1.
Дан код:
public class Quest1 {
public static void main(String[] args) {
String str = new String("java");
int i=1;
char j=3;
System.out.println(str.substring(i,j));
}}
В результате при компиляции и запуске будет выведено:
ja;
av;
ava;
jav;
ошибка компиляции: заданы некорректные параметры для метода substring().
Вопрос 7.2.
Какую инструкцию следует использовать, чтобы обнаружить позицию буквы v в строке str = "Java"?
charAt(2,str);
str.charAt(2);
str.indexOf('v');
indexOf(str,'v');
Вопрос 7.3.
Какие из следующих операций корректны при объявлении?
String s = new String("Java"); String t = new String(); String r = null;
r = s + t + r;
r = s + t + ’r’;
r = s & t & r;
r = s && t && r;
Вопрос 7.4.
Дан код:
public class Quest4 {
public static void main(String[] args) {
String str="ava";
char ch=0x74; // 74 - это код символа 'J'
str=ch+str;
System.out.print(str);
}}
В результате при компиляции и запуске будет выведено:
74ava;
Java;
074ava;
ошибка компиляции: недопустимая операция ch+str;
ошибка компиляции: недопустимое объявление char ch=0x74;
нет правильного ответа.
Вопрос 7.5.
Что будет результатом компиляции и выполнения следующего кода?
public class Quest5 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("you java");
s.insert(2, "like ");
System.out.print(s);
}}
yolike u java;
you like java;
ylike ou java;
you java like;
ошибка компиляции;
нет правильного ответа.
Г
ИСКЛЮЧЕНИЯ И ОШИБКИ
Иерархия и способы обработки
Исключительные ситуации (исключения) возникают во время выполнения программы, когда возникшая проблема не может быть решена в текущем контексте и невозможно продолжение работы программы. Примерами являются особо «популярные»: попытка индексации вне границ массива, вызов метода на нулевой ссылке или деление на нуль. При возникновении исключения создается объект, описывающий это исключение. Затем текущий ход выполнения приложения останавливается, и включается механизм обработки исключений. При этом ссылка на объект-исключение передается обработчику исключений, который пытается решить возникшую проблему и продолжить выполнение программы. Если в классе используется метод, в котором может возникнуть проверяемая исключительная ситуация, но не предусмотрена ее обработка, то ошибка возникает еще на этапе компиляции. При создании такого метода программист должен включить в код обработку исключений, которые могут генерировать этот метод, или передать обработку исключения на более высокий уровень методу, вызвавшему данный метод.
Каждой исключительной ситуации поставлен в соответствие некоторый класс. Если подходящего класса не существует, то он может быть создан разработчиком. Все исключения являются наследниками суперклассаThrowable и его подклассов Error и Exception из пакета java.lang.
Рис. 8.1. Иерархия основных классов исключений
Исключительные ситуации типа Error возникают только во время выполнения программы. Такие исключения связаны с серьезными ошибками, к примеру – переполнение стека, и не подлежат исправлению и не могут обрабатываться приложением. Иерархия классов, наследуемых от класса Error, приведена на рисунке 8.2.
Рис. 8.2. Иерархия классов исключений, наследуемых от класса Error.
На рисунке 8.3 приведена иерархия классов исключений, наследуемых от класса Exception.
Проверяемые исключения должны быть обработаны в методе, который может их генерировать, или включены в throws-список метода для дальнейшей обработки в вызывающих методах. Возможность возникновения проверяемого исключения может быть отслежена на этапе компиляции кода.
Во время выполнения могут генерироваться также исключения, которые могут быть обработаны без ущерба для выполнения программы. Иерархия этих исключений приведена на рисунке 8.4. В отличие от проверяемых исключений, класс RuntimeException и порожденные от него классы относятся к непроверяемым исключениям. Компилятор не проверяет, генерирует ли и обрабатывает ли метод эти исключения. Исключения типа RuntimeException автоматически генерируются при возникновении ошибок во время выполнения приложения. Таким образом, нет необходимости в проверке генерации исключения вида:
if(a==null) throw new NullPionterException();
объект класса NullPionterException при возникновении ошибки будет сгенерирован автоматически. Кроме этого, в любом случае нет необходимости в обработке этого исключения непосредственно в методе или в передаче на обработку вызывающему методу с помощью оператора throw. В конце концов исключение будет передано в метод main(), где обрабатывается вызовом метода printStackTrace(), выдающего данные трассировки.
Рис. 8.3. Иерархия классов проверяемых (checked) исключительных ситуаций
Обычно используется один из трех способов обработки исключений:
перехват и обработка исключения в блоке try-catch метода;
объявление исключения в секции throws метода и передача вызывающему методу (для проверяемых исключений);
использование собственных исключений.
Первый подход можно рассмотреть на следующем примере. При клонировании объекта в определенных ситуациях может возникать исключительная ситуация типа CloneNotSupportedException. Например:
public void changeObject(Student ob) {
try {
Object temp = ob.clone();
//реализация
} catch (CloneNotSupportedException e) {
System.err.print(e);
}
}
Рис. 8.4. Иерархия непроверяемых (unchecked) исключений
При клонировании может возникнуть исключительная ситуация в случае, если переданный объект не поддерживает клонирование (не включен интерфейс Cloneable). В этом случае генерируется соответствующий объект, и управление передается блоку catch, в котором обрабатывается данный тип исключения, иначе блок catch пропускается. Блок try похож на обычный логический блок. Блок catch(){} похож на метод, принимающий в качестве единственного параметра ссылку на объект-исключение и обрабатывающий этот объект.
Второй подход демонстрируется на этом же примере. Метод может генерировать исключения, которые сам не обрабатывает, а передает для обработки другим методам, вызывающим данный метод. В этом случае метод должен объявить о таком поведении с помощью ключевого слова throws, чтобы вызывающие методы могли защитить себя от этих исключений. В вызывающих методах должна быть предусмотрена обработка этих исключений. Форма объявления такого метода:
Тип имяМетода(список_аргументов)
throws список_исключений { }
При этом сам таким образом объявляемый метод может содержать блоки try-catch, а может и не содержать их. Например, метод changeObject() можно объявить:
public void changeObject(Student ob)
throws CloneNotSupportedException {
Object temp = ob.clone();
//реализация
}
Ключевое слово throws позволяет разобраться с исключениями методов «чужих» классов, код которых отсутствует. Обрабатывать исключение при этом будет метод, вызывающий changeObject():
public void load(Student stud) {
try {
changeObject(stud);
} catch (CloneNotSupportedException e) {
String error = e.toString();
System.err.println(error);
}
}
Создание собственных исключений будет рассмотрено позже в этой главе.
Если в блоке try может быть сгенеририровано в разных участках кода несколько типов исключений, то необходимо наличие нескольких блоков catch, если только блок catch не обрабатывает все типы исключений.
/* пример # 1 : обработка двух типов исключений: TwoException.java */
package chapt08;
public class TwoException {
public static void main(String[] args) {
try {
int a = (int)(Math.random() * 2);
System.out.println("a = " + a);
int c[] = { 1/a };
c[a] = 71;
} catch(ArithmeticException e) {
System.err.println("деление на 0" + e);
} catch(ArrayIndexOutOfBoundsException e) {
System.err.println(
"превышение границ массива: " + e);
}//последний catch
System.out.println("после блока try-catch");
}
}
Исключение "деление на 0" возникнет при инициализации элемента массива а=0. В противном случае (при а=1) генерируется исключение "превышение границ массива" при попытке присвоить значение второму элементу массива с[], который содержит только один элемент. Однако пример, приведенный выше, носит чисто демонстративный характер и не является образцом хорошего кода, так как в этой ситуации можно было обойтись простой проверкой аргументов на допустиые значения перед выполнением операций. К тому же генерация и обработка исключения – операция значительно более ресурсоемкая, чем вызов оператора if для проверки аргумента. Исключения должны применяться только для обработки исключительных ситуаций, и если существует возможность обойтись без них, то следует так и поступить.
Подклассы исключений в блоках catch должны следовать перед любым из их суперклассов, иначе суперкласс будет перехватывать эти исключения. Например:
try {/*код, который может вызвать исключение*/
} catch(RuntimeException e) { /* суперкласс RuntimeException
перехватит объекты всех своих подклассов */
} catch(ArithmeticException e) {} /* не может быть вызван,
поэтому возникает ошибка компиляции */
Операторы try можно вкладывать друг в друга. Если у оператора try низкого уровня нет раздела catch, соответствующего возникшему исключению, поиск будет развернут на одну ступень выше, и будут проверены разделы catch внешнего оператора try.
/* пример # 2 : вложенные блоки try-catch: MultiTryCatch.java */
package chapt08;
public class MultiTryCatch {
public static void main(String[] args) {
try { // внешний блок
int a = (int) (Math.random() * 2) - 1;
System.out.println("a = " + a);
try { // внутренний блок
int b = 1/a;
StringBuffer sb = new StringBuffer(a);
} catch (NegativeArraySizeException e) {
System.err.println(
"недопустимый размер буфера: " + e);
}
} catch (ArithmeticException e) {
System.err.println("деление на 0" + e);
}
}
}
В результате запуска приложения при a=0 будет сгенерировано исключение ArithmeticException, а подходящий для его обработки блок try–catch является внешним по отношению к месту генерации исключения. Этот блок и будет задействован для обработки возникшей исключительной ситуации.
Третий подход к обработке исключений будет рассмотрен ниже на примере создания пользовательских исключений.