为什么java.lang.Throwable不是一个抽象类?

时间:2010-11-29 17:19:22

标签: java class-design throwable

可能重复:why-is-java-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。使用它来获取堆栈跟踪并不是这个定义的好例子。

2 个答案:

答案 0 :(得分:3)

  

我不明白为什么Throwable   不是抽象类。

答案清楚地说明here

  

为什么不能   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 :(得分:1)

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

编辑:

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

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