Я вижу, как вы поймать исключение, которое я могу напечатать e.getCause()
, хотя он всегда null
.
Мне нужно установить его где-нибудь, или что-то не хватает, которое задает причину null?
Я вижу, как вы поймать исключение, которое я могу напечатать e.getCause()
, хотя он всегда null
.
Мне нужно установить его где-нибудь, или что-то не хватает, которое задает причину null?
Исключение имеет атрибуты message
и cause
. Сообщение - это описание, рассказывающее читателю более или менее точно, что пошло не так. cause
- это нечто другое: оно есть, если доступно, другое (вложенное) Throwable
.
Эта концепция часто используется, если мы используем собственные исключения:
catch(IOException e) {
throw new ApplicationException("Failed on reading file soandso", e);
// ^ Message ^ Cause
}
Изменить - в ответ на комментарий @djangofans.
Стандарт заключается в том, что вложенное выражение (причина) печатается с его трассировкой стека.
Запуск этого небольшого приложения
public class Exceptions {
public static void main(String[] args) {
Exception r = new RuntimeException("Some message");
throw new RuntimeException("Some other message", r);
}
}
выводит
Exception in thread "main" java.lang.RuntimeException: Some other message
at Exceptions.main(Exceptions.java:4)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.RuntimeException: Some message
at Exceptions.main(Exceptions.java:3)
... 5 more
Оба сообщения включены.
Причина обычно устанавливается в конструкторе исключения. Посмотрите публичное исключение (сообщение String, Throwable cause).
Если он не установлен в конструкторе, вы можете вызвать initCause().
class Exception
имеет конструкторы, которые принимают a cause
Throwable. Вы должны вызвать эти конструкторы или предоставить конструкторам своим настраиваемым классам исключения, которые вызывают эти суперструкторы.
getCause. Возвращает причину этого throwable или null, если причина несуществующей или неизвестной. (Причина - это бросок, который заставил это бросать бросить.)
Прочитайте документ Java: getCause