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

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

Жанры

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

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

Хорошая девочка

Кистяева Марина
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Хорошая девочка

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Одержимый

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

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Маленькая хозяйка большого герцогства

Вера Виктория
2. Герцогиня
Любовные романы:
любовно-фантастические романы
7.80
рейтинг книги
Маленькая хозяйка большого герцогства

Курсант: Назад в СССР 10

Дамиров Рафаэль
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10

Гридень 2. Поиск пути

Гуров Валерий Александрович
2. Гридень
Детективы:
исторические детективы
5.00
рейтинг книги
Гридень 2. Поиск пути

Ищу жену для своего мужа

Кат Зозо
Любовные романы:
любовно-фантастические романы
6.17
рейтинг книги
Ищу жену для своего мужа

Оружие победы

Грабин Василий Гаврилович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Оружие победы

Звездная Кровь. Изгой II

Елисеев Алексей Станиславович
2. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой II

Конунг Туманного острова

Чайка Дмитрий
12. Третий Рим
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Конунг Туманного острова

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке