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

为什么java.lang.Throwable不是一个抽象类?,java,class-design,throwable,Java,Class Design,Throwable,可能重复: 嗨!我不明白为什么Throwable不是抽象类。对于这些,我只看到一个用例:在日志系统中,找出调用层次结构。但是它可以是这个类或其他类的静态方法。那么,为什么呢 谢谢 upd 来自java.util.logging.LogRecord // Get the stack trace. StackTraceElement stack[] = (new Throwable()).getStackTrace(); 为什么它不能被丢弃。getStackTrace;或者像java.lang.T

可能重复:

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

谢谢

upd

来自java.util.logging.LogRecord

// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
为什么它不能被丢弃。getStackTrace;或者像java.lang.Thread中那样

(new Exception()).getStackTrace();
这样我们可以避免扔掉新的垃圾

upd2 来自javadoc

可丢弃类是超类 中的所有错误和异常 Java语言


因此,作为一个超类,它应该是抽象的,imho。按照这个定义,使用它来获取stacktrace不是一个好例子。

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

编辑:


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

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

编辑:

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

我不明白为什么要扔掉 这不是抽象类

答案是清楚的

为什么不可能 Throwable.getStackTrace;或者像 java.lang.Thread

(new Exception()).getStackTrace();
非常简单,getStackTrace调用非静态的getOurStackTrace方法。如果getStackTrace是静态的,那么getOurStackTrace也应该是静态的。这不会发生,因为printStackTrace方法使用getOurStackTrace。JavaDoc对此进行了详细阐述:

提供对 由打印的堆栈跟踪信息 printStackTrace

java.lang.Throwable的源代码:

 public StackTraceElement[] getStackTrace() {
        return (StackTraceElement[]) getOurStackTrace().clone();
    }
另外,如果您阅读getOurStackTrace方法的代码,您将看到它调用以下方法:

private native int getStackTraceDepth();
据我所知,不能是静态的,我可能是错的。

我不明白为什么要扔掉 这不是抽象类

答案是清楚的

为什么不可能 Throwable.getStackTrace;或者像 java.lang.Thread

(new Exception()).getStackTrace();
非常简单,getStackTrace调用非静态的getOurStackTrace方法。如果getStackTrace是静态的,那么getOurStackTrace也应该是静态的。这不会发生,因为printStackTrace方法使用getOurStackTrace。JavaDoc对此进行了详细阐述:

提供对 由打印的堆栈跟踪信息 printStackTrace

java.lang.Throwable的源代码:

 public StackTraceElement[] getStackTrace() {
        return (StackTraceElement[]) getOurStackTrace().clone();
    }
另外,如果您阅读getOurStackTrace方法的代码,您将看到它调用以下方法:

private native int getStackTraceDepth();
据我所知,不能是静态的,我可能是错的。

您能演示一下如何使用它吗?在java.util.logging中,它用于获取StackTraceeElement[]new Throwable.getStackTrace;我不认为制作可丢弃的摘要真的会阻止你…你可以使用新的可丢弃的{}.printStackTrace来进行一次性日志记录,或者你保留的日志记录。无论如何,你可能应该使用更干净的线程解决方案,或者至少使用一个封装它的库方法。@Mark,记录StackTraceeElement[]对于可读性来说是很乏味的。例如,您不希望它被其他日志消息分割。esp另一个stack trace.fair,不过对于非一次性日志记录,我希望其中一个会使用一个日志框架来为您完成所有这些。无论如何,我见过的所有日志框架都有直接记录一次性日志的方法。您能展示一下如何使用它吗?在java.util.logging中,它用于获取StackTraceeElement[]new Throwable.getStackTrace;我不认为制作可丢弃的摘要真的会阻止你…你可以使用新的可丢弃的{}.printStackTrace来进行一次性日志记录,或者你保留的日志记录。无论如何,你可能应该使用更干净的线程解决方案,或者至少使用一个封装它的库方法。@Mark,记录StackTraceeElement[]对于可读性来说是很乏味的。例如,您不希望它被其他日志消息分割。esp另一个stack trace.fair,不过对于非一次性日志记录,我希望使用一个日志框架来为您完成所有这一切,无论如何,我见过的所有日志框架都有直接记录一次性日志的方法。本机方法可以是静态的。请看java.lang.StrictMath中的几乎任何方法。@Peter Lawrey,它在JDK的Throwable类中,mine是1.6.0-21,我相信它是从JDK 4开始引入的?如果native可以是静态的,我认为Throwable.getStackTrace比new Throwable更好。getStackTrace@The精英绅士,java.lang.Thread也有这个方法。从1.4开始标记为@。不确定是否有JDK 4@斯塔斯:如果是静态的,它们的语义会完全不同。Throwable子类的getStackTrace应该在fillInStackT所在的点返回stacktrace
比赛被称为,这是在建设的可抛弃的典型。静态调用它必须返回方法调用时stacktrace的任何内容,这将非常不有用。例如,它将stacktrace打印到日志代码中,而不是打印到异常发生的位置。本机方法可以是静态的。请参见java.lang.StrictMath中的几乎任何方法。@Peter Lawrey,它在JDK的Throwable类中,mine是1.6.0-21,我相信它是从JDK 4开始引入的?如果native可以是静态的,我认为Throwable.getStackTrace比new Throwable更好。getStackTrace@The精英绅士,java.lang.Thread也有这个方法。从1.4开始标记为@。不确定是否有JDK 4@斯塔斯:如果是静态的,它们的语义会完全不同。Throwable子类的getStackTrace应该在调用fillInStackTrace时返回stacktrace,这通常是在Throwable的构造时。静态调用它必须返回方法调用时stacktrace的任何内容,这将非常不有用,例如,它将stacktrace打印到日志代码中,而不是打印到异常发生的位置。它在哪里抛出新的Throwable?不确定你是否需要避免一些从未发生过的事情@彼得·劳瑞:有人会写的。API不仅应该使用my IMHO@Stas,而且应该避免错误编译,因为它被检查为异常。您必须处理它或将其添加到throws子句中。我认为这就足够了。不确信存在严重问题,需要另一种解决方案。@Stas,我的IDE还引发了一个警告禁止的异常,这可能会更改为编译器错误级别。它可能会在何处引发新的Throwable?不确定你是否需要避免一些从未发生过的事情@彼得·劳瑞:有人会写的。API不仅应该使用my IMHO@Stas,而且应该避免错误编译,因为它被检查为异常。您必须处理它或将其添加到throws子句中。我认为这就足够了。不确信存在需要另一个解决方案的严重问题。@Stas,我的IDE还引发了一个警告禁止的异常,该异常可能会更改为编译器错误级别。的可能重复