1

可能重复:why-is-java-lang-throwable-a-class

你好!我不明白为什么 Throwable 不是抽象类。我只看到一个用例:在日志系统中找出调用层次结构。但它可以是这个或其他类的一些静态方法。所以为什么?)

谢谢。

更新

来自 java.util.logging.LogRecord

// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();

为什么它不能Throwable.getStackTrace(); 或在 java.lang.Thread 中

(new Exception()).getStackTrace();

这样我们就可以避免throw new Throwable();

来自 javadoc 的upd2

Throwable 类是 Java 语言中所有错误和异常的超类。

所以,作为一个超类,它应该是抽象的,恕我直言。根据这个定义,使用它来获取堆栈跟踪并不是一个好例子。

4

2 回答 2

3

我不明白为什么 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不能是静态的(我可能错了)。

于 2010-11-29T17:55:21.400 回答
1

我经常用它来记录日志,所以我很高兴它不是抽象的。有一种方法可以获取调用堆栈, Thread.currentThread().getStackTrace() 但这会返回一个 StackTraceElement[],这对于日志记录不是很有用。

编辑:

StackTraceElement[] stes = Thread.currentThread().getStackTrace();  

注意:此方法也可用于获取另一个线程的堆栈跟踪,这很方便。

于 2010-11-29T17:25:06.153 回答