Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория экзамен.doc
Скачиваний:
25
Добавлен:
29.05.2015
Размер:
516.61 Кб
Скачать

6. Создание собственных классов исключений

Прежде всего, нужно четко определить ситуации, в которых будет возникать ваше собственное исключение, и подумать, не станет ли его перехват невольно перехватывать также и другие, не учтенные вами исключения.

Потом надо выбрать суперкласс создаваемого класса-исключения. Им может быть класс Exception или один из его многочисленных подклассов.

После этого можно написать класс-исключение. Его имя, по соглашению, должно завершаться словом Exception. Как правило, этот класс состоит только из двух конструкторов и переопределения методов tostringo и getMessageO.

Рассмотрим простой пример. Пусть метод handle(int cipher) обрабатывает арабские цифры 0—9, которые передаются ему в аргументе cipher типа int.

Мы хотим выбросить исключение, если аргумент cipher выходит за диапазон 0—9.

Прежде всего, убедимся, что такого исключения нет в иерархии классов Exception. Ко всему прочему, не отслеживается и более общая ситуация попадания целого числа в какой-то диапазон. Поэтому будем расширять наш класс. Назовем его cipherException, прямо от класса Exception. Определим класс cipherException, как показано в листинге 16.6, и используем его в классе ExceptDemo. На рис. 16.5 продемонстрирован вывод этой программы.

7. Типы коллекций в Java

Список представляет собой упорядоченную коллекция. Есть доступ к элементам по индексу. Может содержать одинаковые элементы.

  • List - расширение Collection для управления упорядоченными коллекциями;

  • ArrayList - обычный динамический массив. Без синхронизации;

  • Vector - динамический массив с синхронизацией, а значит чуть медленей;

  • LinkedList - связной список. Без синхронизации. Более эффективен при частых вставках/удалений элементов в середине, чем ArrayList/Vector. Используется как стек, очередь, двунаправленная очередь;

  • Stack - расширение Vector для реализации стека;

8. Класс ArrayList, конструкторы, основные методы

Класс ArrayList <E>

  • java.lang. Объект

    • java.util. AbstractCollection<E>

      • java.util. AbstractList <E>

        • java.util. ArrayList <E>

  • Все Реализованные Интерфейсы:

СериализуемыйCloneableПовторяемый <E>, Набор <E>, Список <E>, RandomAccess

Прямые Известные Подклассы:

AttributeListRoleListRoleUnresolvedList

public class ArrayList<E>

extends AbstractList<E>

implements List<E>, RandomAccess, Cloneable, Serializable

Реализация массива изменяемого размера интерфейса List. Реализации все дополнительные операции списка, и разрешения все элементы, включая null. В дополнение к реализации интерфейса List этот class обеспечивает методы, чтобы управлять размером массива, который используется внутренне, чтобы сохранить список. (Этот class примерно эквивалентен Vector, за исключением того, что это несинхронизируется.)

В постоянное время работают size, isEmpty, get, set, iterator, и операции listIterator. Выполнения работы add в амортизируемое постоянное время, то есть, добавляя n элементы требуют O (n) время. Все другие операции, выполненные в линейное время (примерно говорящий). Постоянный множитель низок по сравнению с этим для реализации LinkedList.

У каждого экземпляра ArrayList есть емкость. Емкость является размером массива, используемого, чтобы сохранить элементы в списке. Это является всегда, по крайней мере, столь же большим как размер списка. Поскольку элементы добавляются к ArrayList, его емкость растет автоматически. Детали политики роста не определяются вне факта, что у добавления элемента есть постоянная амортизируемая стоимость времени.

Приложение может увеличить емкость экземпляра ArrayList прежде, чем добавить большое количество элементов, используя работу ensureCapacity. Это может уменьшить количество инкрементного перераспределения.

Отметьте, что эта реализация не синхронизируется. Если многократные потоки получают доступ к экземпляру ArrayList одновременно, и по крайней мере один из потоков изменяет список структурно, этодолжно синхронизироваться внешне. (Структурная модификация является любой работой, которая добавляет или удаляет один или более элементов, или явно изменяет размеры отступающего массива; просто установка значения элемента не является структурной модификацией.) Это обычно выполняется, синхронизируясь на некотором объекте, который естественно инкапсулирует список. Если никакой такой объект не существует, список должен быть "обернут", используя Collections.synchronizedList метод. Это лучше всего делается во время создания, чтобы предотвратить случайный несинхронизируемый доступ к списку:

List list = Collections.synchronizedList(new ArrayList(...));

iterators возвратился этим class iterator и listIterator методы являются сбоем быстро: если список структурно изменяется когда-либо после того, как iterator создается, всегда кроме через собственный iterator's remove или add методы, iterator бросит a ConcurrentModificationException. Таким образом, перед лицом параллельной модификации, iterator перестал работать быстро и чисто, вместо того, чтобы рискнуть произвольным, недетерминированным поведением в неопределенное время в будущем.

Отметьте, что поведение сбоя быстро iterator не может быть гарантировано, как, вообще говоря, невозможно сделать любые трудные гарантии в присутствии несинхронизируемой параллельной модификации. Приведите бросок iterators к сбою быстро ConcurrentModificationException на основе максимальных усилий. Поэтому, было бы неправильно записать программу, которая зависела от этого исключения для его правильности: поведение сбоя быстро iterators должно использоваться только, чтобы обнаружить ошибки.

Этот class является элементом Платформы Наборов Java.