Класс 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 может иметь причину, заключается в том, что класс, который его выбрасывает, построен на основе абстракции более низкого уровня, и операция на верхнем уровне терпит неудачу из-за сбоя на нижнем уровне. Плохой дизайн – позволять выбрасываемому нижним уровнем объекту Throwable распространяться наружу, так как он обычно не связан с абстракцией, предоставляемой верхним уровнем. Кроме того, это свяжет API верхнего уровня с деталями его реализации, предполагая, что исключение нижнего уровня является проверяемым исключением. Выбрасывание «обёрнутого исключения» (т.е. исключения, содержащего причину) позволяет верхнему уровню передать детали сбоя своему вызывающему методу без таких недостатков. Это сохраняет гибкость изменения реализации верхнего уровня без изменения его API (в частности, набора исключений, выбрасываемых его методами).
Вторая причина, по которой объект Throwable может иметь причину, заключается в том, что метод, который его выбрасывает, должен соответствовать интерфейсу общего назначения, который не позволяет методу выбрасывать причину напрямую. Например, предположим, что постоянная коллекция соответствует интерфейсу Collection, и что ее постоянство реализовано поверх java.io. Предположим, что внутренности метода add могут выбросить IOException. Реализация может передать детали IOException своему вызывающему методу, соблюдая интерфейс Collection, обёрнув IOException в соответствующее необрабатываемое исключение. (Спецификация постоянной коллекции должна указывать, что она способна выбрасывать такие исключения.)
Причину можно связать с объектом Throwable двумя способами: через конструктор, принимающий причину в качестве аргумента, или через метод initCause(Throwable). Новые классы Throwable, которые хотят позволить связывать причины, должны предоставлять конструкторы, принимающие причину и делегирующие (возможно, косвенно) одному из конструкторов Throwable, принимающих причину. Поскольку метод initCause является публичным, он позволяет связать причину с любым объектом Throwable, даже с «унаследованным объектом Throwable», чья реализация предшествует добавлению механизма цепочки исключений в Throwable.
По соглашению, класс Throwable и его подклассы имеют два конструктора: один без аргументов и один, принимающий аргумент String, который можно использовать для создания сообщения о деталях. Кроме того, те подклассы, которые, вероятно, будут иметь связанную причину, должны иметь ещё два конструктора: один, принимающий Throwable (причину), и один, принимающий String (сообщение о деталях) и Throwable (причину).
- См. Спецификацию языка Java:
- 11.2 Проверка исключений на этапе компиляции
- C:
- 1.0
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
| Создаёт новый объект Throwable с null в качестве сообщения о деталях. |
||
| Создаёт новый объект Throwable со указанным сообщением о деталях. |
||
| Создаёт новый объект Throwable со указанным сообщением о деталях и причиной. |
||
protected |
Создаёт новый объект Throwable со указанным сообщением о деталях, причиной, включённым или выключенным подавлением, и включённым или выключенным записью стека вызовов. |
|
| Создаёт новый объект Throwable с указанной причиной и сообщением о деталях (cause==null ? null : cause.toString()) (которое обычно содержит класс и сообщение о деталях cause). |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final void |
addSuppressed |
Добавляет указанное исключение к исключениям, которые были подавлены для доставки этого исключения. |
Throwable |
fillInStackTrace() |
Заполняет стек вызовов. |
Throwable |
getCause() |
Возвращает причину этого объекта Throwable или null, если причина отсутствует или неизвестна. |
String |
getLocalizedMessage() |
Создаёт локализованное описание этого объекта Throwable. |
String |
getMessage() |
Возвращает строку сообщения о деталях этого объекта Throwable. |
StackTraceElement[] |
getStackTrace() |
Обеспечивает программированный доступ к информации о стеке вызовов, выводимой методом printStackTrace(). |
final Throwable[] |
getSuppressed() |
Возвращает массив, содержащий все исключения, которые были подавлены, как правило, оператором try-с-ресурсами, для доставки этого исключения. |
Throwable |
initCause |
Инициализирует причину этого объекта Throwable указанным значением. |
void |
printStackTrace() |
Выводит этот объект Throwable и его стек вызовов в стандартный поток ошибок. |
void |
printStackTrace |
Выводит этот объект Throwable и его стек вызовов в указанный поток вывода. |
void |
printStackTrace |
Выводит этот объект Throwable и его стек вызовов в указанный объект PrintWriter. |
void |
setStackTrace |
Устанавливает элементы стека вызовов, которые будут возвращены методом getStackTrace() и выведены методом printStackTrace() и связанными методами. |
String |
toString() |
Возвращает краткое описание этого объекта Throwable. |
Подробное описание конструкторов
Throwable
public Throwable()
null в качестве сообщения об ошибке. Причина не инициализирована и может быть инициализирована позже вызовом initCause(java.lang.Throwable). Метод fillInStackTrace() используется для инициализации стека вызовов в создаваемом объекте Throwable.
Throwable
public Throwable(String message)
initCause(java.lang.Throwable). Метод fillInStackTrace() используется для инициализации стека вызовов в создаваемом объекте Throwable.
- Параметры:
-
message- сообщение об ошибке. Сообщение об ошибке сохраняется для последующего извлечения методомgetMessage().
Throwable
public Throwable(String message, Throwable cause)
Обратите внимание, что сообщение об ошибке, связанное с cause, не автоматически включается в сообщение об ошибке этого объекта Throwable.
Метод fillInStackTrace() используется для инициализации стека вызовов в создаваемом объекте Throwable.
- Параметры:
-
message- сообщение об ошибке (сохраняется для последующего извлечения методомgetMessage()). -
cause- причина (сохраняется для последующего извлечения методомgetCause()). (Разрешено значениеnull, что указывает на отсутствие или неизвестность причины.) - С:
- 1.4
Throwable
public Throwable(Throwable cause)
(cause==null ? null : cause.toString()) (обычно содержащим класс и сообщение об ошибке cause). Этот конструктор полезен для объектов Throwable, которые являются просто оболочками для других объектов Throwable (например, PrivilegedActionException). Метод fillInStackTrace() используется для инициализации стека вызовов в создаваемом объекте Throwable.
- Параметры:
-
cause- причина (сохраняется для последующего извлечения методомgetCause()). (Разрешено значениеnull, что указывает на отсутствие или неизвестность причины.) - С:
- 1.4
Throwable
protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
getSuppressed() для этого объекта вернёт массив нулевой длины, и вызовы addSuppressed(java.lang.Throwable), которые в противном случае добавили бы исключение в список подавленных, не окажут никакого эффекта. Если запись стека вызовов false, этот конструктор не вызовет fillInStackTrace(), a null будет записан в поле stackTrace, и последующие вызовы
fillInStackTrace и setStackTrace(StackTraceElement[]) не установят стек вызовов. Если запись стека вызовов false, getStackTrace() вернёт массив нулевой длины. Обратите внимание, что другие конструкторы 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, или установленную после создания методом initCause(Throwable). Хотя обычно переопределять этот метод необязательно, подкласс может переопределить его, чтобы вернуть причину, установленную каким-либо другим способом. Это подходит для «унаследованного исключения с цепочкой», которое существовало до добавления цепочек исключений в Throwable. Обратите внимание, что не нужно переопределять ни один из методов PrintStackTrace, все из которых вызывают метод getCause, чтобы определить причину Throwable.
- Возвращает:
- причину этого объекта Throwable или
null, если причина отсутствует или неизвестна. - С:
- 1.4
initCause
public Throwable initCause(Throwable cause)
Этот метод может быть вызван не более одного раза. Обычно он вызывается из конструктора или сразу после создания объекта Throwable. Если этот объект Throwable был создан с Throwable(Throwable) или Throwable(String,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]);
}
}
Стек-трейс для исключения с инициализированным, не-null исключением-причиной обычно должен включать стек-трейс для причины. Формат этой информации зависит от реализации, но следующий пример можно считать типичным:
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)
- Parameters:
-
s-PrintStreamдля вывода
printStackTrace
public void printStackTrace(PrintWriter s)
- Parameters:
-
s-PrintWriterдля вывода - Since:
- 1.1
fillInStackTrace
public Throwable fillInStackTrace()
Throwable информацию о текущем состоянии кадров стека для текущей нити. Если стек-трейс этого Throwable не является доступным для записи, вызов этого метода не оказывает никакого влияния.
- Returns:
- ссылка на этот экземпляр
Throwable. - See Also:
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, 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.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/Throwable.html