Spec-Zone.ru › OpenJDK 8

Класс Throwable

  • java.lang.Object
    • java.lang.Throwable
Все реализованные интерфейсы:
Serializable
Прямые известные подклассы:
Error, Exception

public class Throwable
extends Object
implements Serializable

Класс Throwable является суперклассом всех ошибок и исключений в языке Java. Только объекты, являющиеся экземплярами этого класса (или одного из его подклассов), выбрасываются виртуальной машиной Java или могут быть выброшены оператором Java throw. Аналогично, только этот класс или один из его подклассов может быть типом аргумента в операторе catch. Для целей проверки исключений на этапе компиляции Throwable и любой подкласс Throwable, который не является также подклассом RuntimeException или Error, рассматриваются как исключения, требующие проверки.

Экземпляры двух подклассов, Error и Exception, обычно используются для обозначения возникновения исключительных ситуаций. Обычно эти экземпляры создаются непосредственно в контексте исключительной ситуации для включения релевантной информации (такой как данные стека вызовов).

Объект Throwable содержит моментальный снимок стека вызовов потока на момент его создания. Он также может содержать строку сообщения, предоставляющую более подробную информацию об ошибке. Со временем объект Throwable может подавить другие объекты Throwable, предотвращая их распространение. Наконец, объект Throwable может также содержать причину: другой объект Throwable, вызвавший создание данного объекта Throwable. Запись этой информации о причинно-следственной связи называется механизмом «цепных исключений», поскольку причина сама может иметь причину, и так далее, формируя цепочку исключений, каждое из которых вызвано другим.

Одна из причин, по которой объект Throwable может иметь причину, заключается в том, что класс, который его выбрасывает, построен на основе абстракции более низкого уровня, а операция на верхнем уровне терпит неудачу из-за ошибки на нижнем уровне. Неправильным дизайном будет позволить исключению, брошенному нижним слоем, распространяться наружу, так как оно, как правило, не связано с абстракцией, предоставляемой верхним слоем. Кроме того, это связало бы API верхнего уровня с деталями его реализации, предполагая, что исключение нижнего уровня является исключением, требующим проверки. Выбрасывание «обернутого исключения» (т. е. исключения, содержащего причину) позволяет верхнему уровню передать детали ошибки своему вызывающему методу без этих недостатков. Это сохраняет гибкость для изменения реализации верхнего уровня без изменения его API (в частности, набора исключений, выбрасываемых его методами).

Вторая причина, по которой объект Throwable может иметь причину, заключается в том, что метод, который его выбрасывает, должен соответствовать общему интерфейсу, который не позволяет методу выбрасывать причину напрямую. Например, предположим, что постоянный коллектор соответствует интерфейсу Collection, а его сохранение реализовано на основе java.io. Предположим, что внутренний метод add может выбрасывать IOException. Реализация может передать детали IOException вызывающему методу, соблюдая интерфейс Collection, обернув IOException в соответствующее исключение без проверки. (Спецификация постоянного коллектора должна указывать, что он может выбрасывать такие исключения.)

Причина может быть связана с объектом Throwable двумя способами: через конструктор, принимающий причину в качестве аргумента, или через метод initCause(Throwable). Новые классы Throwable, желающие позволить связывать с ними причины, должны предоставлять конструкторы, принимающие причину и делегирующие (возможно, косвенно) одному из конструкторов Throwable, принимающих причину. Поскольку метод initCause является общедоступным, он позволяет связать причину с любым объектом Throwable, даже «устаревшим объектом Throwable», чья реализация предшествовала добавлению механизма цепочки исключений в Throwable.

Согласно соглашению, класс Throwable и его подклассы имеют два конструктора: один без аргументов и один с аргументом String, который может использоваться для создания сообщения детализации. Кроме того, подклассы, у которых, вероятно, может быть связана причина, должны иметь еще два конструктора: один, принимающий причину (cause), и один, принимающий сообщение детализации (detail message) и причину (cause).

См. также:
Serialized Form

Конструкторы

Модификатор Конструктор и описание
Throwable()

Создает новый объект Throwable с null в качестве сообщения детализации.

Throwable(String message)

Создает новый объект Throwable с указанным сообщением детализации.

Throwable(String message, Throwable cause)

Создает новый объект Throwable с указанным сообщением детализации и причиной.

protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)

Создает новый объект Throwable с указанным сообщением детализации, причиной, включением/выключением подавления и включением/выключением записи стека вызовов.

Throwable(Throwable cause)

Создает новый объект Throwable с указанной причиной и сообщением детализации (cause==null ? null : cause.toString()) (обычно содержащим класс и сообщение детализации cause).

Методы

Модификатор и тип Метод и описание
void addSuppressed(Throwable exception)

Добавляет указанное исключение к исключениям, подавленным для доставки текущего исключения.

Throwable fillInStackTrace()

Заполняет стек вызовов.

Throwable getCause()

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

String getLocalizedMessage()

Создает локализованное описание этого объекта Throwable.

String getMessage()

Возвращает строку сообщения детализации этого объекта Throwable.

StackTraceElement[] getStackTrace()

Предоставляет программно доступ к информации стека вызовов, выводимой методом printStackTrace().

Throwable[] getSuppressed()

Возвращает массив, содержащий все исключения, которые были подавлены, обычно оператором try-with-resources, чтобы доставить данное исключение.

Throwable initCause(Throwable cause)

Инициализирует причину этого объекта Throwable указанным значением.

void printStackTrace()

Выводит этот объект Throwable и его стек вызовов в поток стандартной ошибки.

void printStackTrace(PrintStream s)

Выводит этот объект Throwable и его стек вызовов в указанный поток вывода.

void printStackTrace(PrintWriter s)

Выводит этот объект Throwable и его стек вызовов в указанный поток записи.

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()

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

Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.

Throwable

public Throwable(String message)

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

Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.

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

Throwable

public Throwable(String message,
                 Throwable cause)

Создаёт новый объект исключения со заданным сообщением об ошибке и причиной.

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

Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.

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

Throwable

public Throwable(Throwable cause)

Создаёт новый объект исключения со заданной причиной и сообщением об ошибке (cause==null ? null : cause.toString()) (обычно содержащим класс и сообщение об ошибке cause). Этот конструктор полезен для объектов исключений, которые являются в основном обёртками для других объектов исключений (например, PrivilegedActionException).

Метод fillInStackTrace() вызывается для инициализации данных стека вызовов в созданном объекте исключения.

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

Throwable

protected Throwable(String message,
                    Throwable cause,
                    boolean enableSuppression,
                    boolean writableStackTrace)

Создаёт новый объект исключения со заданным сообщением об ошибке, причиной, включением или выключением подавления исключений, и включением или выключением записи стека вызовов. Если подавление исключений отключено, getSuppressed() для этого объекта вернёт массив нулевой длины, и вызовы addSuppressed(java.lang.Throwable), которые в противном случае добавили бы исключение в список подавленных исключений, не будут иметь никакого эффекта. Если запись стека вызовов отключена, этот конструктор не вызовет fillInStackTrace(), поле null будет записано в поле stackTrace, и последующие вызовы fillInStackTrace и setStackTrace(StackTraceElement[]) не установят стек вызовов. Если запись стека вызовов отключена, getStackTrace() вернёт массив нулевой длины.

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

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

Методы

getMessage

public String getMessage()

Возвращает строковое сообщение об ошибке этого объекта исключения.

Возвращает:
строковое сообщение об ошибке этого объекта исключения Throwable (которое может быть null).

getLocalizedMessage

public String getLocalizedMessage()

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

Возвращает:
Локализованное описание этого объекта исключения.
Since:
JDK1.1

getCause

public Throwable getCause()

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

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

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

initCause

public Throwable initCause(Throwable cause)

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

Этот метод может быть вызван не более одного раза. Обычно он вызывается из конструктора или сразу после создания объекта исключения. Если этот объект исключения был создан с помощью Throwable(Throwable) или Throwable(String,Throwable), этот метод не может быть вызван ни разу.

Пример использования этого метода для унаследованного типа исключения без другой поддержки для установки причины:

try {
     lowLevelOp();
 } catch (LowLevelException le) {
     throw (HighLevelException)
           new HighLevelException().initCause(le); // Legacy constructor
 }
Параметры:
cause - причина (которая сохраняется для последующего извлечения методом getCause()). (Разрешено значение null, что указывает на отсутствие или неизвестность причины.)
Возвращает:
ссылку на этот объект исключения Throwable.
Исключения:
IllegalArgumentException - если cause является этим объектом исключения. (Исключение не может быть собственной причиной.)
IllegalStateException - если этот объект исключения был создан с помощью Throwable(Throwable) или Throwable(String,Throwable), или этот метод уже был вызван для этого объекта исключения.
Since:
1.4

toString

public String toString()

Возвращает краткое описание этого объекта исключения. Результатом является конкатенация:

  • имени класса этого объекта (с помощью getName)
  • ": " (двоеточие и пробел)
  • результата вызова метода getLocalizedMessage() этого объекта
Если getLocalizedMessage возвращает null, возвращается только имя класса.

Overrides:
toString в классе Object
Возвращает:
строковое представление этого объекта исключения.

printStackTrace

public void printStackTrace()

Выводит данное исключение и его стек-трейс в стандартный поток ошибок. Этот метод выводит стек-трейс для данного объекта Throwable в поток вывода ошибок, который является значением поля System.err. Первая строка вывода содержит результат метода toString() для этого объекта. Остальные строки представляют данные, ранее записанные методом fillInStackTrace(). Формат этой информации зависит от реализации, но следующий пример может считаться типичным:

java.lang.NullPointerException
        at MyClass.mash(MyClass.java:9)
        at MyClass.crunch(MyClass.java:6)
        at MyClass.main(MyClass.java:3)
Этот пример был получен при выполнении программы:
class MyClass {
     public static void main(String[] args) {
         crunch(null);
     }
     static void crunch(int[] a) {
         mash(a);
     }
     static void mash(int[] b) {
         System.out.println(b[0]);
     }
 }
Стек-трейс для исключения с инициализированным, непустым причиной обычно должен включать стек-трейс для причины. Формат этой информации зависит от реализации, но следующий пример может считаться типичным:
HighLevelException: MidLevelException: LowLevelException
         at Junk.a(Junk.java:13)
         at Junk.main(Junk.java:4)
 Caused by: MidLevelException: LowLevelException
         at Junk.c(Junk.java:23)
         at Junk.b(Junk.java:17)
         at Junk.a(Junk.java:11)
         ... 1 more
 Caused by: LowLevelException
         at Junk.e(Junk.java:30)
         at Junk.d(Junk.java:27)
         at Junk.c(Junk.java:21)
         ... 3 more
Обратите внимание на наличие строк, содержащих символы "...". Эти строки указывают, что остальная часть стек-трейса для этого исключения соответствует указанному числу кадров с нижней части стек-трейса исключения, которое вызвало это исключение (исключение "внешней оболочки"). Этот сокращенный формат значительно сокращает длину вывода в распространённом случае, когда исключение обертки выбрасывается из того же метода, что и исключение "причины". Приведенный выше пример был получен при выполнении программы:
public class Junk {
     public static void main(String args[]) {
         try {
             a();
         } catch(HighLevelException e) {
             e.printStackTrace();
         }
     }
     static void a() throws HighLevelException {
         try {
             b();
         } catch(MidLevelException e) {
             throw new HighLevelException(e);
         }
     }
     static void b() throws MidLevelException {
         c();
     }
     static void c() throws MidLevelException {
         try {
             d();
         } catch(LowLevelException e) {
             throw new MidLevelException(e);
         }
     }
     static void d() throws LowLevelException {
        e();
     }
     static void e() throws LowLevelException {
         throw new LowLevelException();
     }
 }

 class HighLevelException extends Exception {
     HighLevelException(Throwable cause) { super(cause); }
 }

 class MidLevelException extends Exception {
     MidLevelException(Throwable cause)  { super(cause); }
 }

 class LowLevelException extends Exception {
 }
Начиная с версии 7, платформа поддерживает понятие подавляемых исключений (в сочетании с инструкцией try-with-resources). Любые исключения, которые были подавлены для передачи исключения, выводятся под стек-трейсом. Формат этой информации зависит от реализации, но следующий пример может считаться типичным:
Exception in thread "main" java.lang.Exception: Something happened
  at Foo.bar(Foo.java:10)
  at Foo.main(Foo.java:5)
  Suppressed: Resource$CloseFailException: Resource ID = 0
          at Resource.close(Resource.java:26)
          at Foo.bar(Foo.java:9)
          ... 1 more
Обратите внимание, что обозначение "... n больше" используется для подавленных исключений точно так же, как и для причин. В отличие от причин, подавленные исключения имеют отступ за пределами своих "содержащих исключений".

Исключение может иметь как причину, так и одно или несколько подавленных исключений:

Exception in thread "main" java.lang.Exception: Main block
  at Foo3.main(Foo3.java:7)
  Suppressed: Resource$CloseFailException: Resource ID = 2
          at Resource.close(Resource.java:26)
          at Foo3.main(Foo3.java:5)
  Suppressed: Resource$CloseFailException: Resource ID = 1
          at Resource.close(Resource.java:26)
          at Foo3.main(Foo3.java:5)
 Caused by: java.lang.Exception: I did it
  at Foo3.main(Foo3.java:8)
Аналогично, подавленное исключение может иметь причину:
Exception in thread "main" java.lang.Exception: Main block
  at Foo4.main(Foo4.java:6)
  Suppressed: Resource2$CloseFailException: Resource ID = 1
          at Resource2.close(Resource2.java:20)
          at Foo4.main(Foo4.java:5)
  Caused by: java.lang.Exception: Rats, you caught me
          at Resource2$CloseFailException.<init>(Resource2.java:45)
          ... 2 more

printStackTrace

public void printStackTrace(PrintStream s)

Выводит данное исключение и его стек-трейс в указанный поток вывода.

Parameters:
s - PrintStream для вывода

printStackTrace

public void printStackTrace(PrintWriter s)

Выводит данное исключение и его стек-трейс в указанный поток записи.

Parameters:
s - PrintWriter для вывода
Since:
JDK1.1

fillInStackTrace

public Throwable fillInStackTrace()

Заполняет стек-трейс выполнения. Этот метод записывает в этот объект Throwable информацию о текущем состоянии стековых кадров для текущей нити.

Если стек-трейс данного объекта Throwable не может быть записан, вызов этого метода не имеет эффекта.

Returns:
ссылка на этот экземпляр Throwable.
See Also:
printStackTrace()

getStackTrace

public StackTraceElement[] getStackTrace()

Предоставляет программисту доступ к информации о стек-трейсе, выводимой методом printStackTrace(). Возвращает массив элементов стек-трейса, каждый из которых представляет один стековый кадр. Нулевой элемент массива (при условии, что длина массива не равна нулю) представляет вершину стека, то есть последний вызов метода в последовательности. Обычно это точка, в которой данное исключение было создано и выброшено. Последний элемент массива (при условии, что длина массива не равна нулю) представляет низ стека, то есть первый вызов метода в последовательности.

Некоторые виртуальные машины могут в некоторых обстоятельствах опустить один или несколько стековых кадров из стек-трейса. В крайнем случае, виртуальной машине, не имеющей информации о стек-трейсе данного исключения, разрешено возвращать массив нулевой длины из этого метода. В общем случае, массив, возвращаемый этим методом, будет содержать по одному элементу для каждого кадра, который был бы напечатан методом printStackTrace. Записи в возвращаемый массив не влияют на последующие вызовы этого метода.

Returns:
массив элементов стек-трейса, представляющих стек-трейс, относящийся к данному исключению.
Since:
1.4

setStackTrace

public void setStackTrace(StackTraceElement[] stackTrace)

Устанавливает элементы стек-трейса, которые будут возвращены методом getStackTrace() и напечатаны методами printStackTrace() и связанными методами. Этот метод, предназначенный для использования фреймворками RPC и другими продвинутыми системами, позволяет клиенту переопределить стандартный стек-трейс, который генерируется методом fillInStackTrace() при создании исключения или десериализуется при чтении исключения из потока сериализации.

Если стек-трейс данного объекта Throwable не может быть записан, вызов этого метода не имеет эффекта, кроме валидации его аргумента.

Parameters:
stackTrace - элементы стек-трейса, которые будут ассоциированы с этим Throwable. Указанный массив копируется этим вызовом; изменения в указанном массиве после возврата метода не повлияют на стек-трейс этого Throwable.
Throws:
NullPointerException - если stackTrace является null или если какой-либо из элементов stackTrace являются null
Since:
1.4

addSuppressed

public final void addSuppressed(Throwable exception)

Добавляет указанное исключение к исключениям, которые были подавлены для передачи этого исключения. Этот метод потокобезопасен и обычно вызывается (автоматически и неявно) инструкцией try-with-resources.

Поведение подавления включено если не отключено через конструктор. Когда подавление отключено, этот метод ничего не делает, кроме валидации своего аргумента.

Обратите внимание, что когда одно исключение вызывает другое исключение, первое исключение обычно перехватывается, а затем второе исключение выбрасывается в ответ. Другими словами, между двумя исключениями существует причинно-следственная связь. В противоположность этому, существуют ситуации, когда два независимых исключения могут быть выброшены в блоках кода-близнецах, особенно в блоке try инструкции try-with-resources и сгенерированном компилятором блоке finally, который закрывает ресурс. В этих ситуациях только одно из выброшенных исключений может быть распространено. В инструкции try-with-resources, когда существуют два таких исключения, исключение, исходящее из блока try, распространяется, а исключение из блока finally добавляется в список подавленных исключений исключения из блока try. По мере выхода исключения из стека оно может накапливать несколько подавленных исключений.

Исключение может иметь подавленные исключения и при этом вызываться другим исключением. Является ли исключение причиной известно на момент его создания, в отличие от вопроса, будет ли исключение подавлять другие исключения, что обычно определяется только после выброса исключения.

Обратите внимание, что программист также может использовать этот метод в ситуациях с несколькими исключениями-близнецами, когда только одно из них может быть распространено.

Parameters:
exception - исключение, которое необходимо добавить в список подавленных исключений
Throws:
IllegalArgumentException - если exception является данным исключением; исключение не может подавлять само себя.
NullPointerException - если exception является null
Since:
1.7

getSuppressed

public final Throwable[] getSuppressed()

Возвращает массив, содержащий все исключения, которые были подавлены, как правило, инструкцией try-with-resources, для передачи данного исключения. Если исключения не подавлялись или подавление отключено через конструктор, возвращается пустой массив. Этот метод потокобезопасен. Записи в возвращаемый массив не влияют на последующие вызовы этого метода.

Returns:
массив, содержащий все исключения, которые были подавлены для передачи этого исключения.
Since:
1.7

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

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