почему не java.lang. Throwable абстрактный класс? - PullRequest
1 голос
/ 29 ноября 2010

Возможный дубликат: почему-ява-lang-throwable-a-class

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

Спасибо.

upd

от 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

Класс Throwable является суперклассом всех ошибок и исключений в языке Java.

Так что, как суперкласс, он должен быть абстрактным, imho.Использование этого для получения stacktrace не подходит для этого определения.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

Я не понимаю, почему Throwable не абстрактный класс.

Ответ четко сформулирован здесь .

Почему этого не может быть Throwable.getStackTrace (); или как в java.lang.Thread

Проще говоря, getStackTrace() вызывает метод getOurStackTrace(), который не является статичным. Если getStackTrace() был статическим, то должен getOurStackTrace(). Этого не произойдет, так как метод printStackTrace() использует getOurStackTrace(). Это разработано в JavaDoc:

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

Источник для java.lang. Throwable:

 public StackTraceElement[] getStackTrace() {
        return (StackTraceElement[]) getOurStackTrace().clone();
    }

Кроме того, если вы прочитаете код метода getOurStackTrace(), вы увидите, что он вызывает следующий метод:

private native int getStackTraceDepth();

Насколько я знаю, native не может быть статичным (я могу ошибаться).

1 голос
/ 29 ноября 2010

Я использую это довольно часто для регистрации, поэтому я рад, что это не абстрактно.Существует метод для получения стека вызовов, Thread.currentThread (). GetStackTrace (), но он возвращает StackTraceElement [], который не очень полезен для регистрации.1005 * Примечание: этот метод также работает для получения трассировки стека другого потока, что может быть удобно.

...