русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Блок try


Дата добавления: 2015-06-12; просмотров: 848; Нарушение авторских прав


Если вы «находитесь» внутри метода и инициируете исключение (или это делает другой вызванный метод), этот метод завершит работу при возникновении исключения. Но если вы не хотите, чтобы оператор throw завершил работу метода, разместите в методе специальный блок для перехвата исключения — так называемый блок try. Этот блок представляет собой простую область действия, которой предшествует ключевое слово

try:

try {

// Фрагмент, способный возбуждать исключения

}

Если бы не обработка исключений, для тщательной проверки ошибок вам пришлось бы добавить к вызову каждого метода дополнительный код для проверки ошибок — даже при многократном вызове одного метода. С обработкой исключений весь код размещается в блокеtry, который и перехватывает все возможные исключения в одном месте. А это означает, что вашу программу становится значительно легче писать и читать, поскольку выполняемая задача не сме­шивается с обработкой ошибок.

Обработчики исключений

Конечно, возбужденное исключение в конечном итоге должно быть где-то обработано. Этим местом является обработчик исключений, который создается для каждого исключения, которое вы хотите перехватить. Обработчики исключений размещаются прямо за блоком try и обозначаются ключевым словом catch:

try {

// Часть программы, способная возбуждать исключения

} catch(Typel idl) {

// Обработка исключения Typel

} catch(Туре2 id2) {

// Обработка исключения Type2

} catch(ТуреЗ id3) {

// Обработка исключения ТуреЗ

} //И Т.д.

Каждое предложение catch (обработчик исключения) напоминает маленький метод, принимающий один и только один аргумент определенного типа. Идентификатор (idl, id2 и т. д.) может использоваться внутри обработчика точно так же, как и метод распоряжается своими аргументами. Иногда этот идентификатор остается невостребованным, так как тип исключения дает достаточно информации для его обработки, но тем не менее присутствует он всегда. Обработчики всегда следуют прямо за блоком try. При возникновении исключения механизм обработки исключений ищет первый из обработчиков исключений, аргумент которого соответствует текущему типу исключения. После этого он передает управление в блок catch, и таким образом исключение считается обработанным. После выполнения предложения catch поиск обработчиков исключения прекращается. Выполняется только одна секция catch, соответствующая типу исключения; в этом отношении обработка исключений отличается от команды switch, где нужно дописывать break после каждого case, чтобы предотвратить исполнение всех прочих case. Заметьте также, что внутри блока try могут вызываться различные методы, способные породить одинаковые типы исключения, но обработчик понадобится всего один.



 

Прерывание в сравнении с возобновлением

В теории обработки исключений имеется две основные модели. Модель прерывания (которое используется в Java и C++) предполагает, что ошибка настолько серьезна, что при возникновении исключения продолжить исполнение невозможно. Кто бы ни возбудил исключение, сам факт его выдачи означает, что исправить ситуацию «на месте» невозможно и возвращать управление обратно не нужно. Альтернативная модель называется возобновлением. Она подразумевает, что обработчик ошибок сделает что-то для исправления ситуации, после чего предпринимается попытка повторить неудавшуюся операцию в надежде на успешный исход. В таком случае исключение больше напоминает вызов метода — чтобы применить модель возобновления в Java, вам придется пойти именно по этому пути (то есть не возбуждать исключение, а вызвать метод, способный решить проблему). Также можно создать блок try внутри цикла while, который станет снова и снова обращаться к этому блоку, пока не будет достигнут нужный результат. Исторически сложилось, что программисты, использующие операционные системы с поддержкой возобновления, со временем переходили к модели прерывания, забывая другую модель. Хотя идея возобновления выглядит привлекательно, она не настолько полезна на практике. Основная причина кроется в обратной связи: обработчик ошибки часто должен знать, где произошло исключение и содержать специальный код для каждого отдельного места ошибки. А это усложняет написание и поддержку программ, особенно для больших систем, где исключения могут быть сгенерированы во многих различных местах.

 

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

Ваш выбор не ограничивается использованием уже существующих в Java исключений. Иерархия исключений JDK не может предусмотреть все возможные ошибки, поэтому вы вправе создавать собственные типы исключений для обозначения специфических ошибок вашей программы. Для создания собственного класса исключения вам придется определить его производным от уже существующего типа — желательно наиболее близкого к вашей ситуации (хоть это и не всегда возможно). В простейшем случае создается класс с конструктором по умолчанию:

//: exceptions/InheritingExceptions.java

// Создание собственного исключения

 

class SimpleException extends Exception {}

 

public class InheritingExceptions {

public void f() throws SimpleException {

System.out.println("Возбуждаем SimpleException из f()");

throw new SimpleException();

}

public static void main(String[] args) {

InheritingExceptions sed = new InheritingExceptions();

try {

sed.f();

} catch(SimpleException e) {

System.out.println("Перехвачено!");

}

}

}

<spoiler text="Output:">

Возбуждаем SimpleExceptі on из f()

Перехвачено!

</spoiler> Компилятор создает конструктор по умолчанию, который автоматически вызывает конструктор базового класса. Конечно, в этом случае вы лишаетесь конструктора вида SimpleException(String), но на практике он не слишком часто используется. Как вы еще увидите, наиболее важно в исключении именно имя класса, так что в основном исключений, похожих на созданное выше, будет достаточно. В примере результаты работы выводятся на консоль. Впрочем, их также можно направить в стандартный поток ошибок, что достигается использованием класса System.err. Обычно это правильнее, чем выводить в поток System.out, который может быть перенаправлен. При выводе результатов с помощью System.err пользователь заметит их скорее, чем при выводе в System.out. Также можно создать класс исключения с конструктором, получающим аргумент String:

//: exceptions/FullConstructors.java

 

class MyException extends Exception {

public MyException() {}

public MyException(String msg) { super(msg); }

}

 

public class FullConstructors {

public static void f() throws MyException {

System.out.println("Возбуждаем MyException изf()");

throw new MyException();

}

public static void g() throws MyException {

System.out.println("Возбуждаем MyException из g()");

throw new MyException("Создано в g()");

}

public static void main(String[] args) {

try {

f();

} catch(MyException e) {

e.printStackTrace(System.out);

}

try {

g();

} catch(MyException e) {

e.printStackTrace(System.out);

}

}

}

<spoiler text="Output:">

Возбуждаем MyException из f()

MyException

at Ful1 Constructors.f(Ful1 Constructors.java:11)

at Full Constructors main(FullConstructors.java:19)

Возбуждаем MyException из g()

MyException: Создано в g()

at Full Constructors g(Ful1Constructors.java:15)

at FullConstructors.main(FullConstructors.java 24)

</spoiler> Изменения незначительны — появилось два конструктора, определяющие способ создания объекта MyException. Во втором конструкторе используется конструктор родительского класса с аргументом String, вызываемый ключевым словом super. В обработчике исключений вызывается метод printStackTrace() класса Throwable (базового для Exception). Этот метод выводит информацию о последовательности вызовов, которая привела к точке возникновения исключения. В нашем примере информация направляется в System.out, но вызов по умолчанию направляет информацию в стандартный поток ошибок:

e.printStackTrace();

Регистрация исключений

Вспомогательное пространство имен java.util.logging позволяет зарегистрировать информацию об исключениях в журнале. Базовые средства регистрации достаточно просты:

//: exceptions/LoggingExceptions.java

// Регистрация исключений с использованием Logger

import java.util.logging.*;

import java.io.*;

 

class LoggingException extends Exception {

private static Logger logger =

Logger.getLogger("LoggingException");

public LoggingException() {

StringWriter trace = new StringWriter();

printStackTrace(new PrintWriter(trace));

logger.severe(trace.toString());

}

}

 

public class LoggingExceptions {

public static void main(String[] args) {

try {

throw new LoggingException();

} catch(LoggingException e) {

System.err.println("Caught " + e);

}

try {

throw new LoggingException();

} catch(LoggingException e) {

System.err.println("Caught " + e);

}

}

}

<spoiler text="Output:"> (85% match)

Aug 30, 2005 4:02:31 PM LoggingException <init>

SEVERE: LoggingException

at LoggingExceptions.main(LoggingExceptions.java:19)

 

Caught LoggingException

Aug 30, 2005 4:02:31 PM LoggingException <init>

SEVERE: LoggingException

at LoggingExceptions.main(LoggingExceptions.java:24)

Caught LoggingException </spoiler> Статический метод Logger.getLogger() создает объект Logger, ассоциируемый с аргументом String (обычно имя пакета и класса, к которому относятся ошибки); объект передает свой вывод в System.err. Простейший способ записи ин­формации в Logger заключается в вызове метода, соответствующего уровню ошибки; в нашем примере используется метод severe(). Нам хотелось бы создать String для регистрируемого сообщения из результатов трассировки стека, но метод printStackTrace() по умолчанию не создает String. Для получения String необходимо использовать перегруженную версию printStackTrace() с аргументом java.io.PrintWriter (за подробными объяснениями обращайтесь к главе «Ввод/вывод»). Если передать конструктору PrintWriter объектjava.io.StringWriter, для получения вывода в формате String достаточно вызвать toString().

Подход LoggingException чрезвычайно удобен (вся инфраструктура регистрации встроена в само исключение, и все работает автоматически без вмешательства со стороны клиента), однако на практике чаще применяется перехват и реги­страция «сторонних» исключений, поэтому сообщение должно генерироваться в обработчике исключения:

//: exceptions/LoggingExceptions2.java

// Регистрация перехваченных исключений

import java.util.logging.*;

import java.io.*;

 

public class LoggingExceptions2 {

private static Logger logger =

Logger.getLogger("LoggingExceptions2");

static void logException(Exception e) {

StringWriter trace = new StringWriter();

e.printStackTrace(new PrintWriter(trace));

logger.severe(trace.toString());

}

public static void main(String[] args) {

try {

throw new NullPointerException();

} catch(NullPointerException e) {

logException(e);

}

}

}

<spoiler text="Output:"> (90% match)

Aug 30, 2005 4:07:54 PM LoggingExceptions2 logException

SEVERE: java.lang.NullPointerException

at LoggingExceptions2.main(LoggingExceptions2.java:16)

</spoiler> На этом процесс создания собственных исключений не заканчивается — исключение можно снабдить дополнительными конструкторами и элементами:

//: exceptions/ExtraFeatures.java

// Дальнейшее расширение классов исключений

import static net.mindview.util.Print.*;

 

class MyException2 extends Exception {

private int x;

public MyException2() {}

public MyException2(String msg) { super(msg); }

public MyException2(String msg, int x) {

super(msg);

this.x = x;

}

public int val() { return x; }

public String getMessage() {

return "Detail Message: "+ x + " "+ super.getMessage();

}

}

 

public class ExtraFeatures {

public static void f() throws MyException2 {

print("Throwing MyException2 from f()");

throw new MyException2();

}

public static void g() throws MyException2 {

print("Throwing MyException2 from g()");

throw new MyException2("Originated in g()");

}

public static void h() throws MyException2 {

print("Throwing MyException2 from h()");

throw new MyException2("Originated in h()", 47);

}

public static void main(String[] args) {

try {

f();

} catch(MyException2 e) {

e.printStackTrace(System.out);

}

try {

g();

} catch(MyException2 e) {

e.printStackTrace(System.out);

}

try {

h();

} catch(MyException2 e) {

e.printStackTrace(System.out);

System.out.println("e.val() = " + e.val());

}

}

}

<spoiler text="Output:">

Throwing MyException2 from f()

MyException2: Detail Message: 0 null

at ExtraFeatures.f(ExtraFeatures.java:22)

at ExtraFeatures.main(ExtraFeatures.java:34)

Throwing MyException2 from g()

MyException2: Detail Message: 0 Originated in g()

at ExtraFeatures.g(ExtraFeatures.java:26)

at ExtraFeatures.main(ExtraFeatures.java:39)

Throwing MyException2 from h()

MyException2: Detail Message: 47 Originated in h()

at ExtraFeatures.h(ExtraFeatures.java:30)

at ExtraFeatures.main(ExtraFeatures.java:44)

e.val() = 47

</spoiler> Было добавлено поле данных х вместе с методом, считывающим его значение, а также дополнительный конструктор для инициализации х. Переопределенный метод Throwable.getMessage() выводит более содержательную информацию об исключении. МетодgetMessage() для классов исключений — аналог toString() в обычных классах. Так как исключение является просто видом объекта, расширение возможностей классов исключений можно продолжить. Однако следует помнить, что все эти программисты, использующие ваши библиотеки, могут попросту проигно­рировать все «украшения» — нередко программисты ограничиваются проверкой типа исключения (как чаще всего бывает со стандартными исключениями Java).

 

Спецификации исключений

В языке Java желательно сообщать программисту, вызывающему ваш метод, об исключениях, которые данный метод способен возбуждать. Пользователь, вызывающий метод, сможет написать весь необходимый код для перехвата возможных исключений. Конечно, когда доступен исходный код, программист- клиент может пролистать его в поиске предложений throw, но библиотеки не всегда поставляются с исходными текстами. Чтобы библиотека не превращалась в «черный ящик», в Java добавили синтаксис (обязательный для использования), при помощи которого вы сообщаете клиенту об исключениях, возбуждаемых методом, чтобы он сумел правильно обработать их. Этот синтаксис называется спецификацией исключений (exception specification), входит в объявление метода и следует сразу за списком аргументов.

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

void f() throws TooBig, TooSmall. DivZero { //...

Однако запись

void f() { // ...

означает, что метод не вырабатывает исключений. (Кроме исключений, производных от RuntimeException, которые могут быть возбуждены практически в любом месте — об этом еще будет сказано.)

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

Впрочем, «обмануть» компилятор все же можно: вы вправе объявить о возбуждении исключения, которого на самом деле нет. Компилятор верит вам на слово и заставляет пользователей метода поступать так, как будто им и в самом деле необходимо перехватывать исключение. Таким образом можно «зарезервировать» исключение на будущее и уже потом возбуждать его, не изменяя описания готовой программы. Такая возможность может пригодиться и для создания абстрактных базовых классов и интерфейсов, в производных классах которых может возникнуть необходимость в возбуждении исключений. Исключения, которые проверяются и навязываются еще на этапе компиляции программы, называют контролируемыми (checked).

Перехват произвольных исключений

Можно создать универсальный обработчик, перехватывающий любые типы исключения. Осуществляется это перехватом базового класса всех исключений Exception (существуют и другие базовые типы исключений, но класс Exception является базовым практически для всех программных исключительных ситуаций):

catch(Exception е) {System.out println("nepexвaчeно исключение");}

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

· String getMessage(), String getLocalizedMessage() возвращают подробное сообщение об ошибке (или сообщение, локализованное для текущего контекста);

· String toString() возвращает короткое описание объекта Throwable, включая подробное сообщение, если оно присутствует;

· void printStackTrace(), void printStackTrace(PrintStream), void printStackTrace(java.io.PrintWriter) выводят информацию об объекте Throwable и трассировку стека вызовов для этого объекта. Трассировка стека вызовов показывает последовательность вызова методов, которая привела к точке возникновения исключения. Первый вариант отправляет информацию в стандартный поток ошибок, второй и третий — в поток по вашему выбору (в главе «Ввод/вывод» вы поймете, почему типов потоков два);

· Throwable fillInStackTrace() записывает в объект Throwable информацию о текущем состоянии стека. Метод используется при повторном возбуждении ошибок или исключений.

Вдобавок в вашем распоряжении находятся методы типа Object, базового для Throwable (и для всех остальных классов). При использовании исключений может пригодиться метод getClass(), который возвращает информацию о классе объекта. Эта информация заключена в объекте типа Class. Например, вы можете узнать имя класса вместе с информацией о пакете методом getName() или получить только имя класса методом getSimpleName().

Рассмотрим пример с использованием основных методов класса Exception:

//: exceptions/ExceptionMethods.java

// Демонстрация методов класса Exception

import static net.mindview.util.Print.*;

 

public class ExceptionMethods {

public static void main(String[] args) {

try {

throw new Exception("My Exception");

} catch(Exception e) {

print("Caught Exception");

print("getMessage():" + e.getMessage());

print("getLocalizedMessage():" +

e.getLocalizedMessage());

print("toString():" + e);

print("printStackTrace():");

e.printStackTrace(System.out);

}

}

}

<spoiler text="Output:">

Caught Exception

getMessage():My Exception

getLocalizedMessage():My Exception

toString():java.lang.Exception: My Exception

printStackTrace():

java.lang.Exception: My Exception

at ExceptionMethods.main(ExceptionMethods.java:8)

</spoiler> Как видите, методы последовательно расширяют объем выдаваемой информации — всякий последующий фактически является продолжением предыдущего.

Трассировка стека

Информацию, предоставляемую методом printStackTrace(), также можно получить напрямую вызовом getStackTrace(). Метод возвращает массив элементов трассировки, каждый из которых представляет один кадр стека. Нулевой элемент представляет вершину стека, то есть последний вызванный метод последовательности (точка, в которой был создан и инициирован объект Throwable).

Соответственно, последний элемент массива представляет «низ» стека, то есть первый вызванный элемент последовательности. Рассмотрим простой пример:

//: exceptions/WhoCalled.java

// Программный доступ к данным трассировки стека

 

public class WhoCalled {

static void f() {

// Generate an exception to fill in the stack trace

try {

throw new Exception();

} catch (Exception e) {

for(StackTraceElement ste : e.getStackTrace())

System.out.println(ste.getMethodName());

}

}

static void g() { f(); }

static void h() { g(); }

public static void main(String[] args) {

f();

System.out.println("--------------------------------");

g();

System.out.println("--------------------------------");

h();

}

}

<spoiler text="Output:">

f

main

--------------------------------

f

g

main

--------------------------------

f

g

h

main

</spoiler>

 

Повторное возбуждение исключения

В некоторых ситуациях требуется заново возбудить уже перехваченное исключение; чаще всего это происходит при использовании Exception для перехвата всех исключений. Так как ссылка на текущее исключение уже имеется, вы попросту возбуждаете исключение по этой ссылке:

catch(Exception е) {System.out.println("повторно возбуждено исключение"); throw e;}

При повторном возбуждении исключение передается в распоряжение обработчика более высокого уровня. Все остальные предложения catch текущего блока try игнорируются. Вся информация из объекта, представляющего исключение, сохраняется, и обработчик более высокого уровня, перехватывающий подобные исключения, сможет ее извлечь.

Если вы просто заново возбуждаете исключение, информация о нем, выводимая методом printStackTrace(), будет по-прежнему относиться к месту возникновения исключения, но не к месту его повторного возбуждения. Если вам понадобится использовать новую трассировку стека, вызовите метод fillInStaсkTrасe(), который возвращает исключение (объект Throwable), созданное на базе старого с помещением туда текущей информации о стеке. Вот как это выглядит:

//: exceptions/Rethrowing.java

// // Демонстрация метода fillInStackTrace()

 

public class Rethrowing {

public static void f() throws Exception {

System.out.println("originating the exception in f()");

throw new Exception("thrown from f()");

}

public static void g() throws Exception {

try {

f();

} catch(Exception e) {

System.out.println("Inside g(),e.printStackTrace()");

e.printStackTrace(System.out);

throw e;

}

}

public static void h() throws Exception {

try {

f();

} catch(Exception e) {

System.out.println("Inside h(),e.printStackTrace()");

e.printStackTrace(System.out);

throw (Exception)e.fillInStackTrace();

}

}

public static void main(String[] args) {

try {

g();

} catch(Exception e) {

System.out.println("main: printStackTrace()");

e.printStackTrace(System.out);

}

try {

h();

} catch(Exception e) {

System.out.println("main: printStackTrace()");

e.printStackTrace(System.out);

}

}

}

<spoiler text="Output:">

originating the exception in f()

Inside g(),e.printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.f(Rethrowing.java:7)

at Rethrowing.g(Rethrowing.java:11)

at Rethrowing.main(Rethrowing.java:29)

main: printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.f(Rethrowing.java:7)

at Rethrowing.g(Rethrowing.java:11)

at Rethrowing.main(Rethrowing.java:29)

originating the exception in f()

Inside h(),e.printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.f(Rethrowing.java:7)

at Rethrowing.h(Rethrowing.java:20)

at Rethrowing.main(Rethrowing.java:35)

main: printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.h(Rethrowing.java:24)

at Rethrowing.main(Rethrowing.java:35)

</spoiler> Строка с вызовом fillInStackTrace() становится новой точкой выдачи исключения. Выдаваемое исключение также может отличаться от исходного. В этом случае эффект получается примерно таким же, как при использовании fillInStackTrace() — информация о месте зарождения исключения теряется, а остается информация, относящаяся к новой команде throw.

//: exceptions/RethrowNew.java

// Повторное возбуждение объекта,

// отличающегося от первоначального

class OneException extends Exception {

public OneException(String s) { super(s); }

}

 

class TwoException extends Exception {

public TwoException(String s) { super(s); }

}

 

public class RethrowNew {

public static void f() throws OneException {

System.out.println("originating the exception in f()");

throw new OneException("thrown from f()");

}

public static void main(String[] args) {

try {

try {

f();

} catch(OneException e) {

System.out.println(

"Caught in inner try, e.printStackTrace()");

e.printStackTrace(System.out);

throw new TwoException("from inner try");

}

} catch(TwoException e) {

System.out.println(

"Caught in outer try, e.printStackTrace()");

e.printStackTrace(System.out);

}

}

}

<spoiler text="Output:">

originating the exception in f()

Caught in inner try, e.printStackTrace()

OneException: thrown from f()

at RethrowNew.f(RethrowNew.java:15)

at RethrowNew.main(RethrowNew.java:20)

Caught in outer try, e.printStackTrace()

TwoException: from inner try

at RethrowNew.main(RethrowNew.java:25)

</spoiler> О последнем исключении известно только то, что оно поступило из внутреннего блока try, но не из метода f(). Вам никогда не придется заботиться об удалении предыдущих исключений, и исключений вообще. Все они являются объектами, созданными в общей куче оператором new, и сборщик мусора уничтожает их автоматически.

 

Цепочки исключений

Зачастую необходимо перехватить одно исключение и возбудить следующее, не потеряв при этом информации о первом исключении — это называется цепочкой исключений (exception chaining). До выпуска пакета JDK 1.4 программистам приходилось самостоятельно писать код, сохраняющий информацию о предыдущем исключении, однако теперь конструкторам всех подклассов Throwable может передаваться объект-причина (cause). Предполагается, что причиной является изначальное исключение и передача ее в новый объект обеспечивает трассировку стека вплоть до самого его начала, хотя при этом создается и возбуждается новое исключение. Интересно отметить, что единственными подклассами класса Throwable, принимающими объект-причину в качестве аргумента конструктора, являются три основополагающих класса исключений: Error (используется виртуальной машиной (JVM) для сообщений о системных ошибках), Exception и RuntimeException. Для организации цепочек из других типов исключений придется использовать метод initCause(), а не конструктор. Следующий пример демонстрирует динамическое добавление полей в объект DynamicFields во время работы программы:

//: 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 Object[initialSize][2];

for(int i = 0; i < initialSize; i++)

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

}

public String toString() {

StringBuilder result = new StringBuilder();

for(Object[] obj : fields) {

result.append(obj[0]);

result.append(": ");

result.append(obj[1]);

result.append("\n");

}

return result.toString();

}

private int hasField(String id) {

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

if(id.equals(fields[i][0]))

return i;

return -1;

}



<== предыдущая лекция | следующая лекция ==>
Глава 12 ОБРАБОТКА ОШИБОК И ИСКЛЮЧЕНИЙ | Public Object


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.351 сек.