Класс Throwable
- java.lang.Object
-
- java.lang.Throwable
- Все реализованные интерфейсы:
- Serializable
- Прямые известные подклассы:
- Error, Exception
public class Throwable extends Object implements Serializable
Класс Throwable является суперклассом всех ошибок и исключений в языке Java. Только объекты, являющиеся экземплярами этого класса (или одного из его подклассов), выбрасываются виртуальной машиной Java или могут быть выброшены оператором Java throw. Аналогично, только этот класс или один из его подклассов может быть типом аргумента в операторе catch. Для целей проверки исключений на этапе компиляции Throwable и любой подкласс Throwable, который не является также подклассом RuntimeException или Error, рассматриваются как исключения, требующие проверки.
Экземпляры двух подклассов, Error и Exception, обычно используются для обозначения возникновения исключительных ситуаций. Обычно эти экземпляры создаются непосредственно в контексте исключительной ситуации для включения релевантной информации (такой как данные стека вызовов).
Объект Throwable содержит моментальный снимок стека вызовов потока на момент его создания. Он также может содержать строку сообщения, предоставляющую более подробную информацию об ошибке. Со временем объект Throwable может подавить другие объекты Throwable, предотвращая их распространение. Наконец, объект Throwable может также содержать причину: другой объект Throwable, вызвавший создание данного объекта Throwable. Запись этой информации о причинно-следственной связи называется механизмом «цепных исключений», поскольку причина сама может иметь причину, и так далее, формируя цепочку исключений, каждое из которых вызвано другим.
Одна из причин, по которой объект Throwable может иметь причину, заключается в том, что класс, который его выбрасывает, построен на основе абстракции более низкого уровня, а операция на верхнем уровне терпит неудачу из-за ошибки на нижнем уровне. Неправильным дизайном будет позволить исключению, брошенному нижним слоем, распространяться наружу, так как оно, как правило, не связано с абстракцией, предоставляемой верхним слоем. Кроме того, это связало бы API верхнего уровня с деталями его реализации, предполагая, что исключение нижнего уровня является исключением, требующим проверки. Выбрасывание «обернутого исключения» (т. е. исключения, содержащего причину) позволяет верхнему уровню передать детали ошибки своему вызывающему методу без этих недостатков. Это сохраняет гибкость для изменения реализации верхнего уровня без изменения его API (в частности, набора исключений, выбрасываемых его методами).
Вторая причина, по которой объект Throwable может иметь причину, заключается в том, что метод, который его выбрасывает, должен соответствовать общему интерфейсу, который не позволяет методу выбрасывать причину напрямую. Например, предположим, что постоянный коллектор соответствует интерфейсу Collection, а его сохранение реализовано на основе java.io. Предположим, что внутренний метод add может выбрасывать IOException. Реализация может передать детали IOException вызывающему методу, соблюдая интерфейс Collection, обернув IOException в соответствующее исключение без проверки. (Спецификация постоянного коллектора должна указывать, что он может выбрасывать такие исключения.)
Причина может быть связана с объектом Throwable двумя способами: через конструктор, принимающий причину в качестве аргумента, или через метод initCause(Throwable). Новые классы Throwable, желающие позволить связывать с ними причины, должны предоставлять конструкторы, принимающие причину и делегирующие (возможно, косвенно) одному из конструкторов Throwable, принимающих причину. Поскольку метод initCause является общедоступным, он позволяет связать причину с любым объектом Throwable, даже «устаревшим объектом Throwable», чья реализация предшествовала добавлению механизма цепочки исключений в Throwable.
Согласно соглашению, класс Throwable и его подклассы имеют два конструктора: один без аргументов и один с аргументом String, который может использоваться для создания сообщения детализации. Кроме того, подклассы, у которых, вероятно, может быть связана причина, должны иметь еще два конструктора: один, принимающий причину (cause), и один, принимающий сообщение детализации (detail message) и причину (cause).
- См. также:
- Serialized Form
Конструкторы
| Модификатор | Конструктор и описание |
|---|---|
Throwable() Создает новый объект Throwable с | |
Throwable(String message) Создает новый объект Throwable с указанным сообщением детализации. | |
Throwable(String message,
Throwable cause) Создает новый объект Throwable с указанным сообщением детализации и причиной. | |
protected |
Throwable(String message,
Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) Создает новый объект Throwable с указанным сообщением детализации, причиной, включением/выключением подавления и включением/выключением записи стека вызовов. |
Throwable(Throwable cause) Создает новый объект Throwable с указанной причиной и сообщением детализации |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
void |
addSuppressed(Throwable exception) Добавляет указанное исключение к исключениям, подавленным для доставки текущего исключения. |
Throwable |
fillInStackTrace() Заполняет стек вызовов. |
Throwable |
getCause() Возвращает причину этого объекта Throwable или |
String |
getLocalizedMessage() Создает локализованное описание этого объекта Throwable. |
String |
getMessage() Возвращает строку сообщения детализации этого объекта Throwable. |
StackTraceElement[] |
getStackTrace() Предоставляет программно доступ к информации стека вызовов, выводимой методом |
Throwable[] |
getSuppressed() Возвращает массив, содержащий все исключения, которые были подавлены, обычно оператором |
Throwable |
initCause(Throwable cause) Инициализирует причину этого объекта Throwable указанным значением. |
void |
printStackTrace() Выводит этот объект Throwable и его стек вызовов в поток стандартной ошибки. |
void |
printStackTrace(PrintStream s) Выводит этот объект Throwable и его стек вызовов в указанный поток вывода. |
void |
printStackTrace(PrintWriter s) Выводит этот объект Throwable и его стек вызовов в указанный поток записи. |
void |
setStackTrace(StackTraceElement[] stackTrace) Устанавливает элементы стека вызовов, которые будут возвращены методом |
String |
toString() Возвращает краткое описание этого объекта Throwable. |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Конструкторы
Throwable
public Throwable()
Создаёт новый объект исключения с null в качестве сообщения об ошибке. Причина не инициализирована и может быть инициализирована позже вызовом initCause(java.lang.Throwable).
Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.
Throwable
public Throwable(String message)
Создаёт новый объект исключения со заданным сообщением об ошибке. Причина не инициализирована и может быть инициализирована позже вызовом initCause(java.lang.Throwable).
Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.
- Параметры:
-
message- сообщение об ошибке. Сообщение об ошибке сохраняется для последующего извлечения методомgetMessage().
Throwable
public Throwable(String message,
Throwable cause) Создаёт новый объект исключения со заданным сообщением об ошибке и причиной.
Обратите внимание, что сообщение об ошибке, связанное с cause, не автоматически включается в сообщение об ошибке этого объекта исключения.
Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.
- Параметры:
-
message- сообщение об ошибке (которое сохраняется для последующего извлечения методомgetMessage()). -
cause- причина (которая сохраняется для последующего извлечения методомgetCause()). (Разрешено значениеnull, что указывает на отсутствие или неизвестность причины.) - Since:
- 1.4
Throwable
public Throwable(Throwable cause)
Создаёт новый объект исключения со заданной причиной и сообщением об ошибке (cause==null ? null : cause.toString()) (обычно содержащим класс и сообщение об ошибке cause). Этот конструктор полезен для объектов исключений, которые являются в основном обёртками для других объектов исключений (например, PrivilegedActionException).
Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.
- Параметры:
-
cause- причина (которая сохраняется для последующего извлечения методомgetCause()). (Разрешено значениеnull, что указывает на отсутствие или неизвестность причины.) - Since:
- 1.4
Throwable
protected Throwable(String message,
Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) Создаёт новый объект исключения со заданным сообщением об ошибке, причиной, включением или выключением подавления исключений, и включением или выключением записи стека вызовов. Если подавление исключений отключено, getSuppressed() для этого объекта вернёт массив нулевой длины, и вызовы addSuppressed(java.lang.Throwable), которые в противном случае добавили бы исключение в список подавленных исключений, не будут иметь никакого эффекта. Если запись стека вызовов отключена, этот конструктор не вызовет fillInStackTrace(), поле null будет записано в поле stackTrace, и последующие вызовы fillInStackTrace и setStackTrace(StackTraceElement[]) не установят стек вызовов. Если запись стека вызовов отключена, getStackTrace() вернёт массив нулевой длины.
Обратите внимание, что другие конструкторы Throwable обрабатывают подавление как включённое, а стек вызовов как доступный. Подклассы Throwable должны документировать любые условия, при которых подавление выключено, и документировать условия, при которых стек вызовов не доступен. Отключение подавления должно происходить только в исключительных случаях, когда существуют специальные требования, такие как повторное использование объектов исключений виртуальной машиной в ситуациях с низким объёмом памяти. Ситуации, когда объект исключения многократно перехватывается и повторно выбрасывается, например, для реализации потока управления между двумя подсистемами, являются ещё одним случаем, когда неизменяемые объекты исключений были бы уместны.
- Параметры:
-
message- сообщение об ошибке. -
cause- причина. (Разрешено значениеnull, что указывает на отсутствие или неизвестность причины.) -
enableSuppression- включено или выключено подавление исключений -
writableStackTrace- включение или выключение записи стека вызовов - Since:
- 1.7
- См. также:
-
OutOfMemoryError,NullPointerException,ArithmeticException
Методы
getMessage
public String getMessage()
Возвращает строковое сообщение об ошибке этого объекта исключения.
- Возвращает:
- строковое сообщение об ошибке этого объекта исключения
Throwable(которое может бытьnull).
getLocalizedMessage
public String getLocalizedMessage()
Создаёт локализованное описание этого объекта исключения. Подклассы могут переопределить этот метод, чтобы получить сообщение, специфичное для локали. Для подклассов, которые не переопределяют этот метод, реализация по умолчанию возвращает тот же результат, что и getMessage().
- Возвращает:
- Локализованное описание этого объекта исключения.
- Since:
- JDK1.1
getCause
public Throwable getCause()
Возвращает причину этого объекта исключения или null если причина отсутствует или неизвестна. (Причина — это исключение, которое вызвало данное исключение.)
Эта реализация возвращает причину, которая была предоставлена через один из конструкторов, требующих Throwable, или которая была установлена после создания с помощью метода initCause(Throwable). Хотя обычно переопределять этот метод необязательно, подкласс может переопределить его, чтобы вернуть причину, установленную каким-то другим способом. Это подходит для "унаследованного исключения" (chained throwable), существовавшего до добавления цепочек исключений в Throwable. Обратите внимание, что не требуется переопределять любые из методов PrintStackTrace, все из которых вызывают метод getCause для определения причины исключения.
- Возвращает:
- причину этого объекта исключения или
nullесли причина отсутствует или неизвестна. - Since:
- 1.4
initCause
public Throwable initCause(Throwable cause)
Инициализирует причину этого объекта исключения заданным значением. (Причина — это исключение, которое вызвало данное исключение.)
Этот метод может быть вызван не более одного раза. Обычно он вызывается из конструктора или сразу после создания объекта исключения. Если этот объект исключения был создан с помощью Throwable(Throwable) или Throwable(String,Throwable), этот метод не может быть вызван ни разу.
Пример использования этого метода для унаследованного типа исключения без другой поддержки для установки причины:
try {
lowLevelOp();
} catch (LowLevelException le) {
throw (HighLevelException)
new HighLevelException().initCause(le); // Legacy constructor
}
- Параметры:
-
cause- причина (которая сохраняется для последующего извлечения методомgetCause()). (Разрешено значениеnull, что указывает на отсутствие или неизвестность причины.) - Возвращает:
- ссылку на этот объект исключения
Throwable. - Исключения:
-
IllegalArgumentException- еслиcauseявляется этим объектом исключения. (Исключение не может быть собственной причиной.) -
IllegalStateException- если этот объект исключения был создан с помощьюThrowable(Throwable)илиThrowable(String,Throwable), или этот метод уже был вызван для этого объекта исключения. - Since:
- 1.4
toString
public String toString()
Возвращает краткое описание этого объекта исключения. Результатом является конкатенация:
- имени класса этого объекта (с помощью getName)
- ": " (двоеточие и пробел)
- результата вызова метода
getLocalizedMessage()этого объекта
getLocalizedMessage возвращает null, возвращается только имя класса. printStackTrace
public void printStackTrace()
Выводит данное исключение и его стек-трейс в стандартный поток ошибок. Этот метод выводит стек-трейс для данного объекта Throwable в поток вывода ошибок, который является значением поля System.err. Первая строка вывода содержит результат метода toString() для этого объекта. Остальные строки представляют данные, ранее записанные методом fillInStackTrace(). Формат этой информации зависит от реализации, но следующий пример может считаться типичным:
java.lang.NullPointerException
at MyClass.mash(MyClass.java:9)
at MyClass.crunch(MyClass.java:6)
at MyClass.main(MyClass.java:3) Этот пример был получен при выполнении программы: class MyClass {
public static void main(String[] args) {
crunch(null);
}
static void crunch(int[] a) {
mash(a);
}
static void mash(int[] b) {
System.out.println(b[0]);
}
} Стек-трейс для исключения с инициализированным, непустым причиной обычно должен включать стек-трейс для причины. Формат этой информации зависит от реализации, но следующий пример может считаться типичным: HighLevelException: MidLevelException: LowLevelException
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
at Junk.c(Junk.java:23)
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
... 1 more
Caused by: LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
... 3 more Обратите внимание на наличие строк, содержащих символы "...". Эти строки указывают, что остальная часть стек-трейса для этого исключения соответствует указанному числу кадров с нижней части стек-трейса исключения, которое вызвало это исключение (исключение "внешней оболочки"). Этот сокращенный формат значительно сокращает длину вывода в распространённом случае, когда исключение обертки выбрасывается из того же метода, что и исключение "причины". Приведенный выше пример был получен при выполнении программы: public class Junk {
public static void main(String args[]) {
try {
a();
} catch(HighLevelException e) {
e.printStackTrace();
}
}
static void a() throws HighLevelException {
try {
b();
} catch(MidLevelException e) {
throw new HighLevelException(e);
}
}
static void b() throws MidLevelException {
c();
}
static void c() throws MidLevelException {
try {
d();
} catch(LowLevelException e) {
throw new MidLevelException(e);
}
}
static void d() throws LowLevelException {
e();
}
static void e() throws LowLevelException {
throw new LowLevelException();
}
}
class HighLevelException extends Exception {
HighLevelException(Throwable cause) { super(cause); }
}
class MidLevelException extends Exception {
MidLevelException(Throwable cause) { super(cause); }
}
class LowLevelException extends Exception {
} Начиная с версии 7, платформа поддерживает понятие подавляемых исключений (в сочетании с инструкцией try-with-resources). Любые исключения, которые были подавлены для передачи исключения, выводятся под стек-трейсом. Формат этой информации зависит от реализации, но следующий пример может считаться типичным: Exception in thread "main" java.lang.Exception: Something happened
at Foo.bar(Foo.java:10)
at Foo.main(Foo.java:5)
Suppressed: Resource$CloseFailException: Resource ID = 0
at Resource.close(Resource.java:26)
at Foo.bar(Foo.java:9)
... 1 more Обратите внимание, что обозначение "... n больше" используется для подавленных исключений точно так же, как и для причин. В отличие от причин, подавленные исключения имеют отступ за пределами своих "содержащих исключений".
Исключение может иметь как причину, так и одно или несколько подавленных исключений:
Exception in thread "main" java.lang.Exception: Main block
at Foo3.main(Foo3.java:7)
Suppressed: Resource$CloseFailException: Resource ID = 2
at Resource.close(Resource.java:26)
at Foo3.main(Foo3.java:5)
Suppressed: Resource$CloseFailException: Resource ID = 1
at Resource.close(Resource.java:26)
at Foo3.main(Foo3.java:5)
Caused by: java.lang.Exception: I did it
at Foo3.main(Foo3.java:8) Аналогично, подавленное исключение может иметь причину: Exception in thread "main" java.lang.Exception: Main block
at Foo4.main(Foo4.java:6)
Suppressed: Resource2$CloseFailException: Resource ID = 1
at Resource2.close(Resource2.java:20)
at Foo4.main(Foo4.java:5)
Caused by: java.lang.Exception: Rats, you caught me
at Resource2$CloseFailException.<init>(Resource2.java:45)
... 2 more
printStackTrace
public void printStackTrace(PrintStream s)
Выводит данное исключение и его стек-трейс в указанный поток вывода.
- Parameters:
-
s-PrintStreamдля вывода
printStackTrace
public void printStackTrace(PrintWriter s)
Выводит данное исключение и его стек-трейс в указанный поток записи.
- Parameters:
-
s-PrintWriterдля вывода - Since:
- JDK1.1
fillInStackTrace
public Throwable fillInStackTrace()
Заполняет стек-трейс выполнения. Этот метод записывает в этот объект Throwable информацию о текущем состоянии стековых кадров для текущей нити.
Если стек-трейс данного объекта Throwable не может быть записан, вызов этого метода не имеет эффекта.
- Returns:
- ссылка на этот экземпляр
Throwable. - See Also:
printStackTrace()
getStackTrace
public StackTraceElement[] getStackTrace()
Предоставляет программисту доступ к информации о стек-трейсе, выводимой методом printStackTrace(). Возвращает массив элементов стек-трейса, каждый из которых представляет один стековый кадр. Нулевой элемент массива (при условии, что длина массива не равна нулю) представляет вершину стека, то есть последний вызов метода в последовательности. Обычно это точка, в которой данное исключение было создано и выброшено. Последний элемент массива (при условии, что длина массива не равна нулю) представляет низ стека, то есть первый вызов метода в последовательности.
Некоторые виртуальные машины могут в некоторых обстоятельствах опустить один или несколько стековых кадров из стек-трейса. В крайнем случае, виртуальной машине, не имеющей информации о стек-трейсе данного исключения, разрешено возвращать массив нулевой длины из этого метода. В общем случае, массив, возвращаемый этим методом, будет содержать по одному элементу для каждого кадра, который был бы напечатан методом printStackTrace. Записи в возвращаемый массив не влияют на последующие вызовы этого метода.
- Returns:
- массив элементов стек-трейса, представляющих стек-трейс, относящийся к данному исключению.
- Since:
- 1.4
setStackTrace
public void setStackTrace(StackTraceElement[] stackTrace)
Устанавливает элементы стек-трейса, которые будут возвращены методом getStackTrace() и напечатаны методами printStackTrace() и связанными методами. Этот метод, предназначенный для использования фреймворками RPC и другими продвинутыми системами, позволяет клиенту переопределить стандартный стек-трейс, который генерируется методом fillInStackTrace() при создании исключения или десериализуется при чтении исключения из потока сериализации.
Если стек-трейс данного объекта Throwable не может быть записан, вызов этого метода не имеет эффекта, кроме валидации его аргумента.
- Parameters:
-
stackTrace- элементы стек-трейса, которые будут ассоциированы с этимThrowable. Указанный массив копируется этим вызовом; изменения в указанном массиве после возврата метода не повлияют на стек-трейс этогоThrowable. - Throws:
-
NullPointerException- еслиstackTraceявляетсяnullили если какой-либо из элементовstackTraceявляютсяnull - Since:
- 1.4
addSuppressed
public final void addSuppressed(Throwable exception)
Добавляет указанное исключение к исключениям, которые были подавлены для передачи этого исключения. Этот метод потокобезопасен и обычно вызывается (автоматически и неявно) инструкцией try-with-resources.
Поведение подавления включено если не отключено через конструктор. Когда подавление отключено, этот метод ничего не делает, кроме валидации своего аргумента.
Обратите внимание, что когда одно исключение вызывает другое исключение, первое исключение обычно перехватывается, а затем второе исключение выбрасывается в ответ. Другими словами, между двумя исключениями существует причинно-следственная связь. В противоположность этому, существуют ситуации, когда два независимых исключения могут быть выброшены в блоках кода-близнецах, особенно в блоке try инструкции try-with-resources и сгенерированном компилятором блоке finally, который закрывает ресурс. В этих ситуациях только одно из выброшенных исключений может быть распространено. В инструкции try-with-resources, когда существуют два таких исключения, исключение, исходящее из блока try, распространяется, а исключение из блока finally добавляется в список подавленных исключений исключения из блока try. По мере выхода исключения из стека оно может накапливать несколько подавленных исключений.
Исключение может иметь подавленные исключения и при этом вызываться другим исключением. Является ли исключение причиной известно на момент его создания, в отличие от вопроса, будет ли исключение подавлять другие исключения, что обычно определяется только после выброса исключения.
Обратите внимание, что программист также может использовать этот метод в ситуациях с несколькими исключениями-близнецами, когда только одно из них может быть распространено.
- Parameters:
-
exception- исключение, которое необходимо добавить в список подавленных исключений - Throws:
-
IllegalArgumentException- еслиexceptionявляется данным исключением; исключение не может подавлять само себя. -
NullPointerException- еслиexceptionявляетсяnull - Since:
- 1.7
getSuppressed
public final Throwable[] getSuppressed()
Возвращает массив, содержащий все исключения, которые были подавлены, как правило, инструкцией try-with-resources, для передачи данного исключения. Если исключения не подавлялись или подавление отключено через конструктор, возвращается пустой массив. Этот метод потокобезопасен. Записи в возвращаемый массив не влияют на последующие вызовы этого метода.
- Returns:
- массив, содержащий все исключения, которые были подавлены для передачи этого исключения.
- Since:
- 1.7
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.