Класс 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 Проверка исключений на этапе компиляции
- С тех пор:
- 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-with-resources, для доставки этого исключения. |
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), которые в противном случае добавляли бы исключение в список подавленных исключений, не будут иметь эффекта. Если запись стека вызовов отключена, этот конструктор не вызовет fillInStackTrace(), значение null будет записано в поле stackTrace, и последующие вызовы
fillInStackTrace и setStackTrace(StackTraceElement[]) не установят стек вызовов. Если запись стека вызовов отключена, 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», предшествующего добавлению цепных исключений к 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()
- имени класса этого объекта (через getName)
- ": " (двоеточие и пробел)
- результата вызова метода
getLocalizedMessage()этого объекта
getLocalizedMessage возвращает null, возвращается только имя класса.- Переопределяет:
-
toStringв классеObject - Возвращает:
- строковое представление этого объекта Throwable.
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, 2021, 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://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Throwable.html