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

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

Жанры

Философия 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 постоянно растет, и едва ли имеет смысл описывать их в книге. Любая программная библиотека от стороннего производителя, скорее всего, также будет иметь собственный набор исключений. Здесь важнее понять принцип работы и поступать с исключениями сообразно.

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

Попаданка 3

Ахминеева Нина
3. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 3

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

Два лика Ирэн

Ром Полина
Любовные романы:
любовно-фантастические романы
6.08
рейтинг книги
Два лика Ирэн

Одержимый

Поселягин Владимир Геннадьевич
4. Красноармеец
Фантастика:
боевая фантастика
5.00
рейтинг книги
Одержимый

Испытание Огня

Гаврилова Анна Сергеевна
3. Академия Стихий
Фантастика:
фэнтези
9.43
рейтинг книги
Испытание Огня

Измена. Возвращение любви!

Леманн Анастасия
3. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Возвращение любви!

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Невеста клана

Шах Ольга
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Невеста клана

В семье не без подвоха

Жукова Юлия Борисовна
3. Замуж с осложнениями
Фантастика:
социально-философская фантастика
космическая фантастика
юмористическое фэнтези
9.36
рейтинг книги
В семье не без подвоха

Возвышение Меркурия. Книга 15

Кронос Александр
15. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 15

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

Младший сын князя

Ткачев Андрей Сергеевич
1. Аналитик
Фантастика:
фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Младший сын князя