Вопрос

Возможный дубликат: Почему-джава-ланг-бросок-а-класс

Привет! Я не понимаю, почему бросание не абстрактно. Я вижу только один вариант использования для них: в системах ведения журнала для выяснения иерархии вызовов. Но это может быть какой -то статический метод для этого или другого класса. Итак, почему?)

Спасибо.

уполномоченный

от 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();  

Примечание. Этот метод также работает, чтобы получить след стека другого потока, который может быть удобным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top