Spec-Zone.ru › OpenJDK 24

Класс 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 может иметь причину, заключается в том, что класс, который его выбрасывает, построен на основе абстракции более низкого уровня, и операция на верхнем уровне терпит неудачу из-за сбоя на нижнем уровне. Плохой дизайн – позволять выбрасываемому нижним уровнем объекту 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()
Throwable(String message)
Throwable(String message, Throwable cause)
Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
Throwable(Throwable cause)
Модификатор Конструктор Описание
Создаёт новый объект Throwable с null в качестве сообщения о деталях.
Создаёт новый объект Throwable со указанным сообщением о деталях.
Создаёт новый объект Throwable со указанным сообщением о деталях и причиной.
protected
Создаёт новый объект Throwable со указанным сообщением о деталях, причиной, включённым или выключенным подавлением, и включённым или выключенным записью стека вызовов.
Создаёт новый объект Throwable с указанной причиной и сообщением о деталях (cause==null ? null : cause.toString()) (которое обычно содержит класс и сообщение о деталях cause).

Краткое описание методов

Модификатор и тип Метод Описание
final void addSuppressed(Throwable exception)
Добавляет указанное исключение к исключениям, которые были подавлены для доставки этого исключения.
Throwable fillInStackTrace()
Заполняет стек вызовов.
Throwable getCause()
Возвращает причину этого объекта Throwable или null, если причина отсутствует или неизвестна.
String getLocalizedMessage()
Создаёт локализованное описание этого объекта Throwable.
String getMessage()
Возвращает строку сообщения о деталях этого объекта Throwable.
StackTraceElement[] getStackTrace()
Обеспечивает программированный доступ к информации о стеке вызовов, выводимой методом printStackTrace().
final Throwable[] getSuppressed()
Возвращает массив, содержащий все исключения, которые были подавлены, как правило, оператором try-с-ресурсами, для доставки этого исключения.
Throwable initCause(Throwable cause)
Инициализирует причину этого объекта Throwable указанным значением.
void printStackTrace()
Выводит этот объект Throwable и его стек вызовов в стандартный поток ошибок.
void printStackTrace(PrintStream s)
Выводит этот объект Throwable и его стек вызовов в указанный поток вывода.
void printStackTrace(PrintWriter s)
Выводит этот объект Throwable и его стек вызовов в указанный объект PrintWriter.
void setStackTrace(StackTraceElement[] stackTrace)
Устанавливает элементы стека вызовов, которые будут возвращены методом getStackTrace() и выведены методом printStackTrace() и связанными методами.
String toString()
Возвращает краткое описание этого объекта Throwable.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Подробное описание конструкторов

Throwable

public Throwable()
Создаёт новый объект Throwable с null в качестве сообщения об ошибке. Причина не инициализирована и может быть инициализирована позже вызовом initCause(java.lang.Throwable).

Метод fillInStackTrace() используется для инициализации стека вызовов в создаваемом объекте Throwable.

Throwable

public Throwable(String message)
Создаёт новый объект Throwable со строкой сообщения об ошибке. Причина не инициализирована и может быть инициализирована позже вызовом initCause(java.lang.Throwable).

Метод fillInStackTrace() используется для инициализации стека вызовов в создаваемом объекте Throwable.

Параметры:
message - сообщение об ошибке. Сообщение об ошибке сохраняется для последующего извлечения методом getMessage().

Throwable

public Throwable(String message, Throwable cause)
Создаёт новый объект Throwable со строкой сообщения об ошибке и причиной.

Обратите внимание, что сообщение об ошибке, связанное с cause, не автоматически включается в сообщение об ошибке этого объекта Throwable.

Метод fillInStackTrace() используется для инициализации стека вызовов в создаваемом объекте Throwable.

Параметры:
message - сообщение об ошибке (сохраняется для последующего извлечения методом getMessage()).
cause - причина (сохраняется для последующего извлечения методом getCause()). (Разрешено значение null, что указывает на отсутствие или неизвестность причины.)
С:
1.4

Throwable

public Throwable(Throwable cause)
Создаёт новый объект Throwable с указанной причиной и сообщением об ошибке (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)
Создаёт новый объект Throwable с указанным сообщением об ошибке, причиной, включением/выключением подавления исключений и включением/выключением записи стека вызовов. Если подавление отключено, getSuppressed() для этого объекта вернёт массив нулевой длины, и вызовы addSuppressed(java.lang.Throwable), которые в противном случае добавили бы исключение в список подавленных, не окажут никакого эффекта. Если запись стека вызовов false, этот конструктор не вызовет fillInStackTrace(), a null будет записан в поле stackTrace, и последующие вызовы fillInStackTrace и setStackTrace(StackTraceElement[]) не установят стек вызовов. Если запись стека вызовов false, getStackTrace() вернёт массив нулевой длины.

Обратите внимание, что другие конструкторы Throwable рассматривают подавление как включённое, а стек вызовов как записываемый. Подклассы Throwable должны документировать любые условия, при которых подавление отключено, и документировать условия, при которых стек вызовов не записывается. Отключение подавления должно происходить только в исключительных случаях, когда существуют особые требования, такие как повторное использование объектов исключений виртуальной машиной при низком уровне памяти. Другая ситуация, в которой уместны неизменяемые объекты исключений, — это ситуация, когда объект исключения многократно перехватывается и перебрасывается, например, для реализации потока управления между двумя подсистемами.

Параметры:
message - сообщение об ошибке.
cause - причина. (Разрешено значение null, что указывает на отсутствие или неизвестность причины.)
enableSuppression - включено ли подавление.
writableStackTrace - разрешена ли запись стека вызовов.
С:
1.7
См. также:
  • OutOfMemoryError
  • NullPointerException
  • ArithmeticException

Подробное описание методов

getMessage

public String getMessage()
Возвращает строку сообщения об ошибке этого объекта Throwable.
Возвращает:
строку сообщения об ошибке для этого экземпляра Throwable (которая может быть null).

getLocalizedMessage

public String getLocalizedMessage()
Создаёт локализованное описание этого объекта Throwable. Подклассы могут переопределить этот метод, чтобы получить сообщение, специфичное для локали. Для подклассов, которые не переопределяют этот метод, реализация по умолчанию возвращает тот же результат, что и getMessage().
Возвращает:
Локализованное описание этого объекта Throwable.
С:
1.1

getCause

public Throwable getCause()
Возвращает причину этого объекта Throwable или null, если причина отсутствует или неизвестна. (Причина — это объект Throwable, который вызвал это исключение.)

Эта реализация возвращает причину, предоставленную через один из конструкторов, требующих Throwable, или установленную после создания методом initCause(Throwable). Хотя обычно переопределять этот метод необязательно, подкласс может переопределить его, чтобы вернуть причину, установленную каким-либо другим способом. Это подходит для «унаследованного исключения с цепочкой», которое существовало до добавления цепочек исключений в Throwable. Обратите внимание, что не нужно переопределять ни один из методов PrintStackTrace, все из которых вызывают метод getCause, чтобы определить причину Throwable.

Возвращает:
причину этого объекта Throwable или null, если причина отсутствует или неизвестна.
С:
1.4

initCause

public Throwable initCause(Throwable cause)
Инициализирует причину этого объекта Throwable указанным значением. (Причина — это объект Throwable, который вызвал это исключение.)

Этот метод может быть вызван не более одного раза. Обычно он вызывается из конструктора или сразу после создания объекта 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()
Возвращает краткое описание этого объекта Throwable. Результат — конкатенация:
  • имени класса этого объекта
  • ": " (двоеточие и пробел)
  • результата вызова метода 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:
  • 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, 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API