Почему java.lang.frowable абстрактного класса?
-
29-09-2019 - |
Вопрос
Возможный дубликат: Почему-джава-ланг-бросок-а-класс
Привет! Я не понимаю, почему бросание не абстрактно. Я вижу только один вариант использования для них: в системах ведения журнала для выяснения иерархии вызовов. Но это может быть какой -то статический метод для этого или другого класса. Итак, почему?)
Спасибо.
уполномоченный
от java.util.logging.logrecord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Почему это не может быть Throwable.getStackTrace();
или как в java.lang.thread
(new Exception()).getStackTrace();
Таким образом, мы можем избежать throw new Throwable();
UPD2.от javadoc.
Обратный класс - это суперкласс всех ошибок и исключения на языке Java.
Итак, как суперкласс, он должен быть абстрактным, ИМХО. Используя его для получения Stacktrace, не очень хороший случай по этому определению.
Решение
Я не понимаю, почему бросание не абстрактно.
Ответ четко указан здесь.
Почему он не может быть брошенным .getStacktrace (); или как в java.lang.thread
Совсем просто, getStackTrace()
называет getOurStackTrace()
метод, который нестатичен. Если getStackTrace()
был статичным, так и должно getOurStackTrace()
. Анкет Это не произойдет как printStackTrace()
Метод использует getOurStackTrace()
. Анкет Это разработано в Javadoc:
Обеспечивает программный доступ к информации о трассировке стека, напечатанной PrintStacktrace ().
Источник для java.lang.trowable:
public StackTraceElement[] getStackTrace() {
return (StackTraceElement[]) getOurStackTrace().clone();
}
Также, если вы прочитаете код getOurStackTrace()
Метод, вы увидите, что он вызывает следующий метод:
private native int getStackTraceDepth();
Насколько я знаю, native
не может быть статичным (я могу ошибаться).
Другие советы
Я использую его довольно часто для регистрации, поэтому я рад, что это не абстрактно. Существует метод для получения стека вызовов, thread.currentThread (). GetStackTrace (), но это возвращает StackTraceElement [], который не очень полезен для ведения журнала.
РЕДАКТИРОВАТЬ:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
Примечание. Этот метод также работает, чтобы получить след стека другого потока, который может быть удобным.