Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

//. exceptions/DynamicFields.java // Динамическое добавление полей в класс. // Пример использования цепочки исключений, import static net mindview.util Print *;

class DynamicFieldsException extends Exception {}

public class DynamicFields { private Object[][] fields; public DynamicFields(int initialSize) {

fields = new 0bject[initialSize][2]. for(int i = 0. i < initialSize. i++)

fields[i] = new Object[] { null, null };

}

public String toStringO {

StringBuilder result = new StringBuilderO. . Л

продолжение &

for(Objected obj : fields) {

result.append(obj[0]); result.append("• "); result.append(obj[l]); result.append("\n");

}

return result.toStringO;

}

private int hasField(String id) {

for(int i = 0; i < fields.length; i++) if(id.equals(fields[1][0])) return i;

return -1:

}

private int

getFieldNumber(String id) throws NoSuchFieldException { int fieldNum = hasField(id); if(fieldNum == -1)

throw new NoSuchFieldException0; return fieldNum;

}

private int makeField(String id) {

for(int i = 0; i < fields.length; i++) 1f(f1elds[i][0] == null) { fields[1][0]

« id; return i;

}

// Пустых полей нет. Добавим новое:

Object[][]tmp = new Object[fields.length + 1][2];

for(int i = 0; i < fields.length; i++)

tmp[i] = fields[i]; for(int i = fields.length; i < tmp.length; i++) tmp[i] = new Object[] { null, null }; fields = tmp;

// Рекурсивный вызов с новыми полями: return makeField(id);

}

public Object

getField(String id) throws NoSuchFieldException { return fields[getFieldNumber(id)][l];

}

public Object setField(String id. Object value)

throws DynamicFieldsException { if(value == null) {

// У большинства исключений нет конструктора.

// принимающего объект-«причину».

// В таких случаях следует использовать

// метод initCauseO, доступный всем подклассам

// класса Throwable.

DynamicFieldsException dfe =

new DynamicFieldsExceptionO; dfe.i ni tCause(new Nul1Poi nterExcepti on О); throw dfe;

}

int fieldNumber = hasField(id); if(fieldNumber == -1)

fieldNumber = makeField(id); Object result = null;

try {

result = getField(id). 11 Получаем старое значение } catchCNoSuchFieldException e) {

// Используем конструктор с «причиной» throw new RuntimeException(e),

}

fields[fieldNumber][l] = value; return result;

}

public static void main(String[] args) {

DynamicFields df = new DynamicFields(3); print(df); try {

df setFieldC'd". "Значение d"); df setField("число", 47); df.setField("4Haio2\ 48); print(df);

df.setFieldC'd". "Новое значение d"), df setField("4HOio3". 11). printCdf: " + df).

printCdf getField(\"d\")) " + df getFieldCd")); Object field = df setFieldC'd". null). // Исключение } catch(NoSuchFieldException e) {

e printStackTrace(System out); } catch(DynamicFieldsException e) {

e.printStackTrace(System.out);

}

}

} /* Output: null null null: null' null: null d:

Значение d число: 47 число2: 48

df- d- Новое значение d число: 47 число:2 48 числоЗ- 11

Значение df .getFieldCd") . Новое значение d Dynami cFi eldsExcepti on

at DynamicFields.setField(DynamicFields.java:64) at DynamicFields main(DynamicFields java:94) Caused by: java.lang.NullPointerException

at DynamicFields.setField(DynamicFields.java 66) )

Каждый объект DynamicFields содержит массив пар Object-Object. Первый объект содержит идентификатор поля (String), а второй объект — значение поля, которое может быть любого типа, кроме неупакованных примитивов. При создании объекта необходимо оценить примерное количество полей. Метод setField либо находит уже существующее поле с заданным именем, либо создает новое поле и сохраняет значение. Когда пространство для полей заканчивается, метод наращивает его, создавая массив размером на единицу больше и копируя в него старые элементы. При попытке размещения пустой ссылки null метод инициирует исключение DynamicFieldsException, создавая объект нужного типа и передавая методу initCause в качестве причины исключение NullPointer-Exception.

Для возвращаемого значения метод setField использует старое значение поля, получая его методом getField, который может возбудить исключение NoSuchFieldException. Если метод getField вызывает программист-клиент, то он ответственен за обработку возможного исключения NoSuchFieldException, однако, если последнее возникает в методе setField, это является ошибкой программы; соответственно, полученное исключение преобразуется в исключение Runtime-Exception с помощью конструктора, принимающего аргумент-причину.

Для создания результата toStringO использует объект StringBuilder. Этот класс будет подробно рассмотрен при описании работы со строками.

Стандартные исключения Java

Класс Java Throwable описывает все объекты, которые могут возбуждаться как исключения. Существует две основные разновидности объектов Throwable (то есть ветви наследования). Тип Error представляет системные ошибки и ошибки времени компиляции, которые обычно не перехватываются (кроме нескольких особых случаев). Тип Exception может быть возбужден из любого метода стандартной библиотеки классов Java или пользовательского метода в случае неполадок при исполнении программы. Таким образом, для программистов интерес представляет прежде всего тип Exception.

Лучший способ получить представление об исключениях — просмотреть документацию JDK. Стоит сделать это хотя бы раз, чтобы получить представление о различных видах исключений, но вскоре вы убедитесь в том, что наиболее принципиальным различием между разными исключениями являются их имена. К тому же количество исключений в Java постоянно растет, и едва ли имеет смысл описывать их в книге. Любая программная библиотека от стороннего производителя, скорее всего, также будет иметь собственный набор исключений. Здесь важнее понять принцип работы и поступать с исключениями сообразно.

Поделиться:
Популярные книги

Город Бездны

Рейнольдс Аластер
1. Космический апокалипсис
Фантастика:
научная фантастика
космическая фантастика
6.71
рейтинг книги
Город Бездны

Битва за небеса

Калашников Максим
Великие противостояния
Фантастика:
альтернативная история
4.67
рейтинг книги
Битва за небеса

Полное собрание сочинений в одной книге

Зощенко Михаил Михайлович
Проза:
классическая проза
русская классическая проза
советская классическая проза
6.25
рейтинг книги
Полное собрание сочинений в одной книге

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Битва в пути

Николаева Галина
Проза:
советская классическая проза
6.60
рейтинг книги
Битва в пути

Газлайтер. Том 3

Володин Григорий Григорьевич
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Основные произведения иностранной художественной литературы. Азия. Африка

Коллектив авторов
Научно-образовательная:
языкознание
литературоведение
5.00
рейтинг книги
Основные произведения иностранной художественной литературы. Азия. Африка

Том 10. Мертвое озеро

Некрасов Николай Алексеевич
10. Собрание сочинений в пятнадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 10. Мертвое озеро

Архивариус

alchoz
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Архивариус

Королевский казначей

Костейн Томас
Приключения:
исторические приключения
6.00
рейтинг книги
Королевский казначей

Газлайтер. Том 2

Володин Григорий Григорьевич
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Кентерберийские рассказы

Чосер Джеффри
Старинная литература:
европейская старинная литература
8.00
рейтинг книги
Кентерберийские рассказы

История политических и правовых учений. Учебник

Коллектив авторов
Научно-образовательная:
история
юриспруденция
5.00
рейтинг книги
История политических и правовых учений. Учебник

AutoCAD 2008. Руководство пользователя

Autodesk
Справочная литература:
руководства
5.00
рейтинг книги
AutoCAD 2008. Руководство пользователя