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

ЖАНРЫ

Философия Java3

Эккель Брюс

Шрифт:

// exceptions/Rethrowing.java // Демонстрация метода fillInStackTraceO

public class Rethrowing {

public static void f throws Exception {

System.out.рппШССоздание исключения в f(D; throw new Exception ("возбуждено из f(D;

}

public static void g throws Exception { try {

f.

} catch(Exception e) {

System, out. pri ntl n("B методе g, e printStackTraceO"). e printStackTrace(System.out); throw e,

}

}

public static void h throws Exception { try {

f:

} catch(Exception e) {

System out.printlnC'B

методе h, e.printStackTrace"),

e printStackTrace(System.out),

throw (Exception)e fill InStackTraceO,

}

}

public static void main(String[] args) { try {

go.

} catch(Exception e) {

System, out pri ntl n( "main- printStackTraceO"). e.printStackTrace(System out);

}

try {

hO.

} catch(Exception e) {

System out.printlnCmairr printStackTraceO"); e printStackTrace(System out);

}

}

} /* Output

Создание исключения в fO

java lang Exception thrown from f

at Rethrowing.f(Rethrowing.java 7) at Rethrowing g(Rethrowing java:11) at Rethrowi ng.mai n(Rethrowi ng.java:29) main. printStackTraceO

java.lang.Exception: thrown from f продолжение &

at Rethrowing.f(Rethrowing.java.7) at Rethrowing.g(Rethrowing java.11) at Rethrowing.main(Rethrowing.java 29) Создание исключения в f В методе h. e.printStackTraceO java.lang.Exception, thrown from f

at Rethrowi ng.f(Rethrowi ng.java•7) at Ret h rowi ng. h (Reth rowi ng. j a va: 20) at Rethrowing main(Rethrowing.java-35) main- printStackTraceO java lang.Exception: thrown from f

at Ret h rowi ng. h (Ret h rowi ng. j a va • 24) at Rethrowi ng.mai n(Rethrowi ng.java:35)

*///:-

Строка с вызовом fiUInStackTrace становится новой точкой выдачи исключения.

Выдаваемое исключение также может отличаться от исходного. В этом случае эффект получается примерно таким же, как при использовании fillln-StackTrace — информация о месте зарождения исключения теряется, а остается информация, относящаяся к новой команде 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 printin("создание исключения в f(D; throw new OneException("из f");

}

public static void main(String[] args) { try {

try {

f.

} catch(OneException e) {

System out.printin(

"Во внутреннем блоке try.

e printStackTraceO"). .

e.printStackTrace(System.out);

throw new TwoException("из внутреннего блока try"),

}

} catch(TwoException e) {

System.out.printin(

"Во внешнем блоке try, e.printStackTraceO"), e.printStackTrace(System.out),

}

}

создание исключения в f

Во внутреннем блоке try,

е.printStackTraceO

OneException- thrown from fO

at RethrowNew.f(RethrowNew.java•15) at Reth rowNew.ma i n(Reth rowNew.j ava•20) Во внешнем блоке try, e.printStackTraceO TwoException из внутреннего блока try

at RethrowNew main(RethrowNew.java 25)

*///.-

О последнем исключении известно только то, что оно поступило из внутреннего блока 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 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)

Поделиться с друзьями: