Класс Throwable
- Все реализуемые интерфейсы:
Serializable
- Прямые известные подклассы:
Error, Exception
public class Throwable extends Object implements Serializable
Throwable является суперклассом всех ошибок и исключений в языке Java. Виртуальная машина Java выбрасывает только объекты, являющиеся экземплярами этого класса (или одного из его подклассов), и только такие объекты можно выбросить с помощью оператора Java throw. Аналогично, в предложении catch в качестве типа аргумента можно указать только этот класс или один из его подклассов. При проверке исключений во время компиляции
Throwable и любой подкласс Throwable, который не является также подклассом ни RuntimeException, ни Error, считаются проверяемыми исключениями. Экземпляры двух подклассов, Error и Exception, обычно используются для обозначения возникновения исключительных ситуаций. Как правило, эти экземпляры создаются непосредственно в контексте исключительной ситуации, чтобы содержать соответствующую информацию (например, данные трассировки стека).
Сбрасываемый объект содержит снимок стека выполнения своего потока на момент создания. Он также может содержать строку сообщения, предоставляющую дополнительную информацию об ошибке. Со временем сбрасываемый объект может подавлять распространение других сбрасываемых объектов. Наконец, сбрасываемый объект может содержать причину: другой сбрасываемый объект, вызвавший создание данного объекта. Запись этой причинно-следственной информации называется механизмом цепочки исключений: у причины, в свою очередь, может быть своя причина и так далее, образуя «цепочку» исключений, каждое из которых вызвано другим.
Одна из причин, по которой у сбрасываемого объекта может быть причина, заключается в том, что класс, который его выбрасывает, построен на основе абстракции более низкого уровня, а операция на верхнем уровне завершается с ошибкой из-за сбоя на нижнем уровне. Было бы плохим решением позволить сбрасываемому объекту, выброшенному нижним уровнем, распространяться наружу, поскольку он, как правило, не связан с абстракцией, предоставляемой верхним уровнем. Кроме того, это связало бы API верхнего уровня с деталями его реализации, если исключение нижнего уровня является проверяемым. Выбрасывание «обёрнутого исключения» (то есть исключения, содержащего причину) позволяет верхнему уровню сообщить вызывающему коду подробности сбоя, не допуская ни одного из этих недостатков. Это сохраняет возможность изменять реализацию верхнего уровня без изменения его API (в частности, набора исключений, выбрасываемых его методами).
Вторая причина, по которой у сбрасываемого объекта может быть причина, заключается в том, что выбрасывающий его метод должен соответствовать универсальному интерфейсу, который не позволяет методу напрямую выбросить причину. Например, предположим, что постоянная коллекция соответствует интерфейсу Collection, а её постоянство реализовано на основе java.io. Предположим, что внутренний код метода add может выбросить IOException. Реализация может сообщить вызывающему коду подробности IOException и при этом соответствовать интерфейсу Collection, обернув IOException в подходящее непроверяемое исключение. (В спецификации постоянной коллекции следует указать, что она может выбрасывать такие исключения.)
Причина может быть связана со сбрасываемым объектом двумя способами: через конструктор, принимающий причину в качестве аргумента, или через метод initCause(Throwable). Новые классы сбрасываемых объектов, допускающие связывание с причиной, должны предоставлять конструкторы, принимающие причину и делегирующие (возможно, косвенно) одному из конструкторов Throwable, принимающих причину. Поскольку метод initCause является общедоступным, он позволяет связать причину с любым сбрасываемым объектом, даже с «устаревшим сбрасываемым объектом», реализация которого появилась до добавления механизма цепочек исключений в Throwable.
По соглашению класс Throwable и его подклассы имеют два конструктора: один без аргументов, а другой принимает аргумент String, который можно использовать для создания подробного сообщения. Кроме того, у подклассов, с которыми может быть связана причина, должны быть ещё два конструктора: один принимает Throwable (причину), а другой — String (подробное сообщение) и Throwable (причину).
- См. Спецификацию языка Java:
- 11.2 Проверка исключений во время компиляции
- С версии:
- 1.0
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
| Создаёт новый сбрасываемый объект, используя null в качестве подробного сообщения. |
||
| Создаёт новый сбрасываемый объект с указанным подробным сообщением. |
||
| Создаёт новый сбрасываемый объект с указанными подробным сообщением и причиной. |
||
protected |
Создаёт новый сбрасываемый объект с указанными подробным сообщением и причиной, а также с включённым или отключённым подавлением и включённой или отключённой возможностью записи трассировки стека. |
|
| Создаёт новый сбрасываемый объект с указанной причиной и подробным сообщением (cause==null ? null : cause.toString()) (которое обычно содержит класс и подробное сообщение cause). |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final void |
addSuppressed |
Добавляет указанное исключение к исключениям, подавленным при обработке этого исключения. |
Throwable |
fillInStackTrace() |
Заполняет трассировку стека выполнения. |
Throwable |
getCause() |
Возвращает причину этого сбрасываемого объекта или null, если причина отсутствует или неизвестна. |
String |
getLocalizedMessage() |
Создаёт локализованное описание этого сбрасываемого объекта. |
String |
getMessage() |
Возвращает строку с подробным сообщением этого сбрасываемого объекта. |
StackTraceElement[] |
getStackTrace() |
Предоставляет программный доступ к информации о трассировке стека, выводимой методом printStackTrace(). |
final Throwable[] |
getSuppressed() |
Возвращает массив, содержащий все исключения, которые были подавлены, как правило, оператором try-with-resources, при обработке этого исключения. |
Throwable |
initCause |
Задаёт указанное значение в качестве причины этого сбрасываемого объекта. |
void |
printStackTrace() |
Выводит этот сбрасываемый объект и его трассировку в стандартный поток ошибок. |
void |
printStackTrace |
Выводит этот сбрасываемый объект и его трассировку в указанный поток печати. |
void |
printStackTrace |
Выводит этот сбрасываемый объект и его трассировку в указанный объект печати. |
void |
setStackTrace |
Задаёт элементы трассировки стека, которые будут возвращаться методом getStackTrace() и выводиться методом printStackTrace() и связанными методами. |
String |
toString() |
Возвращает краткое описание этого сбрасываемого объекта. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект некоторому другому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация устарела и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно после того, как он был уведомлён или прерван. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно после того, как он был уведомлён или прерван, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно после того, как он был уведомлён или прерван, либо до истечения заданного промежутка реального времени. |
Подробное описание конструкторов
Throwable
public Throwable()
null в качестве подробного сообщения. Причина не инициализируется, но впоследствии может быть инициализирована вызовом initCause(Throwable). Для инициализации данных трассировки стека в созданном объекте throwable вызывается метод fillInStackTrace().
Throwable
public Throwable(String message)
initCause(Throwable). Для инициализации данных трассировки стека в созданном объекте throwable вызывается метод fillInStackTrace().
- Параметры:
-
message- подробное сообщение. Подробное сообщение сохраняется для последующего получения методомgetMessage().
Throwable
public Throwable(String message, Throwable cause)
Обратите внимание, что подробное сообщение, связанное с cause, не включается автоматически в подробное сообщение этого объекта throwable.
Для инициализации данных трассировки стека в созданном объекте throwable вызывается метод fillInStackTrace().
- Параметры:
-
message- подробное сообщение (сохраняется для последующего получения методомgetMessage()). -
cause- причина (сохраняется для последующего получения методомgetCause()). (Допускается значениеnull, указывающее, что причина отсутствует или неизвестна.) - С версии:
- 1.4
Throwable
public Throwable(Throwable cause)
(cause==null ? null : cause.toString()) (обычно содержащим класс и подробное сообщение cause). Этот конструктор полезен для объектов throwable, которые являются лишь оболочками для других объектов throwable (например, PrivilegedActionException). Для инициализации данных трассировки стека в созданном объекте throwable вызывается метод fillInStackTrace().
- Параметры:
-
cause- причина (сохраняется для последующего получения методомgetCause()). (Допускается значениеnull, указывающее, что причина отсутствует или неизвестна.) - С версии:
- 1.4
Throwable
protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
getSuppressed() для этого объекта вернет массив нулевой длины, а вызовы addSuppressed(Throwable), которые в противном случае добавили бы исключение в список подавленных, не будут иметь эффекта. Если запись трассировки стека отключена, этот конструктор не будет вызывать fillInStackTrace(), в поле stackTrace будет записано null, а последующие вызовы
fillInStackTrace и setStackTrace(StackTraceElement[]) не будут задавать трассировку стека. Если запись трассировки стека отключена, getStackTrace() вернет массив нулевой длины. Обратите внимание, что в других конструкторах Throwable подавляемость считается включенной, а запись трассировки стека — разрешенной. Подклассы Throwable должны документировать условия, при которых подавляемость отключена, а запись трассировки стека запрещена. Отключать подавляемость следует только в исключительных обстоятельствах, когда существуют особые требования, например когда виртуальная машина повторно использует объекты исключений при нехватке памяти. Другой случай, в котором уместны неизменяемые объекты throwable, — когда определенный объект исключения многократно перехватывается и повторно выбрасывается, например для реализации управления потоком между двумя подсистемами.
- Параметры:
-
message- подробное сообщение. -
cause- причина. (Допускается значениеnull, указывающее, что причина отсутствует или неизвестна.) -
enableSuppression- включена ли подавляемость -
writableStackTrace- разрешена ли запись трассировки стека - С версии:
- 1.7
- См. также:
Подробное описание методов
getMessage
public String getMessage()
- Возвращает:
- строку подробного сообщения этого экземпляра
Throwable(которая может иметь значениеnull).
getLocalizedMessage
public String getLocalizedMessage()
getMessage().- Возвращает:
- Локализованное описание этого объекта throwable.
- С версии:
- 1.1
getCause
public Throwable getCause()
null, если причина отсутствует или неизвестна. (Причина — это объект throwable, из-за которого был выброшен данный объект throwable.) Эта реализация возвращает причину, переданную одному из конструкторов, принимающих Throwable, или заданную после создания вызовом метода initCause(Throwable). Обычно переопределять этот метод не требуется, однако подкласс может переопределить его, чтобы возвращать причину, заданную иным способом. Это уместно для «устаревшего связанного объекта throwable», появившегося до добавления связанных исключений в Throwable. Обратите внимание, что переопределять какие-либо методы PrintStackTrace не требуется: все они вызывают метод getCause для определения причины объекта throwable.
- Возвращает:
- причину этого объекта throwable или
null, если причина отсутствует или неизвестна. - С версии:
- 1.4
initCause
public Throwable initCause(Throwable cause)
Этот метод можно вызвать не более одного раза. Обычно его вызывают из конструктора или сразу после создания объекта throwable. Если этот объект throwable создан с помощью Throwable(Throwable) или Throwable(String,Throwable), этот метод нельзя вызывать ни разу.
Пример использования этого метода для устаревшего типа throwable, который не предоставляет других способов задать причину:
try {
lowLevelOp();
} catch (LowLevelException le) {
throw (HighLevelException)
new HighLevelException().initCause(le); // Legacy constructor
}
- Параметры:
-
cause- причина (сохраняется для последующего получения методомgetCause()). (Допускается значениеnull, указывающее, что причина отсутствует или неизвестна.) - Возвращает:
- ссылку на этот экземпляр
Throwable. - Вызывает исключение:
-
IllegalArgumentException- еслиcause— этот объект throwable. (Объект throwable не может быть причиной самого себя.) -
IllegalStateException- если этот объект throwable создан с помощьюThrowable(Throwable)илиThrowable(String,Throwable)либо если этот метод уже вызывался для данного объекта throwable. - С версии:
- 1.4
toString
public String toString()
- имени класса этого объекта
- ": " (двоеточия и пробела)
- результата вызова метода
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]);
}
}
Трассировка стека объекта throwable с инициализированной ненулевой причиной обычно должна содержать трассировку стека причины. Формат этих данных зависит от реализации, но следующий пример можно считать типичным:
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 more» используется для подавленных исключений так же, как и для причин. В отличие от причин, подавленные исключения имеют больший отступ, чем их «содержащие исключения». У исключения может быть причина и одно или несколько подавленных исключений:
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)
- Параметры:
-
s-PrintStream, используемый для вывода
printStackTrace
public void printStackTrace(PrintWriter s)
- Параметры:
-
s-PrintWriter, используемый для вывода - С версии:
- 1.1
fillInStackTrace
public Throwable fillInStackTrace()
Throwable сведения о текущем состоянии кадров стека для текущего потока. Если трассировка стека этого объекта Throwable не допускает записи, вызов этого метода не оказывает никакого эффекта.
- Возвращает:
- ссылку на этот экземпляр
Throwable. - См. также:
getStackTrace
public StackTraceElement[] getStackTrace()
printStackTrace(). Возвращает массив элементов трассировки стека, каждый из которых представляет один кадр стека. Нулевой элемент массива (если длина массива не равна нулю) соответствует вершине стека — последнему вызову метода в последовательности. Обычно это место, в котором данный объект throwable был создан и выброшен. Последний элемент массива (если длина массива не равна нулю) соответствует основанию стека — первому вызову метода в последовательности. При некоторых обстоятельствах некоторые виртуальные машины могут опускать один или несколько кадров стека в трассировке. В крайнем случае виртуальная машина, не располагающая сведениями о трассировке стека этого объекта throwable, может вернуть из этого метода массив нулевой длины. Как правило, возвращаемый этим методом массив будет содержать по одному элементу для каждого кадра, который был бы выведен методом printStackTrace. Изменения возвращенного массива не влияют на последующие вызовы этого метода.
- Возвращает:
- массив элементов трассировки стека, представляющих трассировку стека этого объекта throwable.
- С версии:
- 1.4
setStackTrace
public void setStackTrace(StackTraceElement[] stackTrace)
getStackTrace() и выводиться методами printStackTrace() и другими связанными методами. Этот метод, предназначенный для использования в платформах RPC и других сложных системах, позволяет клиенту переопределить трассировку стека по умолчанию, которая генерируется методом fillInStackTrace() при создании объекта throwable или десериализуется при чтении объекта throwable из потока сериализации. Если трассировка стека этого объекта Throwable не допускает записи, вызов этого метода не оказывает никакого эффекта, кроме проверки аргумента.
- Параметры:
-
stackTrace- элементы трассировки стека, связываемые с этимThrowable. При вызове этого метода указанный массив копируется; изменения указанного массива после возврата метода не повлияют на трассировку стека этогоThrowable. - Вызывает исключение:
-
NullPointerException- еслиstackTraceимеет значениеnullили если любой элементstackTraceимеет значениеnull - С версии:
- 1.4
addSuppressed
public final void addSuppressed(Throwable exception)
try-with-resources. Подавление включено, если только оно не отключено в конструкторе. Если подавление отключено, этот метод только проверяет аргумент и не выполняет других действий.
Обратите внимание: когда одно исключение вызывает другое, первое исключение обычно перехватывается, после чего в ответ выбрасывается второе. Иными словами, между этими исключениями существует причинно-следственная связь. Однако бывают ситуации, когда в соседних блоках кода могут быть выброшены два независимых исключения, в частности в блоке try оператора try-with-resources и в сгенерированном компилятором блоке finally, закрывающем ресурс. В таких ситуациях может быть передано только одно из выброшенных исключений. В операторе try-with-resources, если возникают два таких исключения, передается исключение из блока try, а исключение из блока finally добавляется в список исключений, подавленных исключением из блока try. При раскрутке стека исключение может накапливать несколько подавленных исключений.
У исключения могут быть подавленные исключения, даже если оно вызвано другим исключением. Наличие или отсутствие причины семантически известно во время создания исключения; наличие или отсутствие исключений, которые оно подавит, обычно определяется только после его выбрасывания.
Обратите внимание: программист также может использовать этот метод в ситуациях, когда возникают несколько исключений в соседних блоках и передать можно только одно из них.
- Параметры:
-
exception- исключение, добавляемое в список подавленных исключений - Вызывает исключение:
-
IllegalArgumentException- еслиexception— этот объект throwable; объект throwable не может подавить сам себя. -
NullPointerException- еслиexceptionимеет значениеnull - С версии:
- 1.7
getSuppressed
public final Throwable[] getSuppressed()
try-with-resources для передачи этого исключения. Если исключения не подавлялись или подавление отключено, возвращается пустой массив. Этот метод является потокобезопасным. Изменения возвращенного массива не влияют на последующие вызовы этого метода.- Возвращает:
- массив, содержащий все исключения, подавленные для передачи этого исключения.
- С версии:
- 1.7
© 1993, 2025, 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.