为什么java.lang.Throwable不是一个抽象类?
可能重复: 嗨!我不明白为什么Throwable不是抽象类。对于这些,我只看到一个用例:在日志系统中,找出调用层次结构。但是它可以是这个类或其他类的静态方法。那么,为什么呢 谢谢 upd 来自java.util.logging.LogRecord为什么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
// 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还引发了一个警告禁止的异常,该异常可能会更改为编译器错误级别。的可能重复