为什么 java.lang.Throwable 不是一个抽象类?
可能重复:why-is-java-lang- throwable-a-class
嗨!我不明白为什么 Throwable 不是抽象类。我只看到这些的一个用例:在日志系统中找出调用层次结构。但它可以是这个类或其他类的一些静态方法。那么,为什么?)
谢谢。
upd
from java.util.logging.LogRecord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
为什么它不能是 Throwable.getStackTrace();
或者像 java.lang.Thread
(new Exception()).getStackTrace();
这样我们可以避免 <代码>抛出新的Throwable();
upd2 来自javadoc
Throwable 类是超类 中的所有错误和异常 Java 语言。
所以,作为一个超类,它应该是抽象的,恕我直言。根据这个定义,使用它来获取堆栈跟踪并不是一个好例子。
Possible duplicate: why-is-java-lang-throwable-a-class
Hi! I doesn't understand why Throwable isn't abstract class. I see only one use case for these: in logging systems for figure out call hierarchy. But it can be some static method for this or other class. So, why?)
Thanks.
upd
from java.util.logging.LogRecord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Why it can't be Throwable.getStackTrace();
or as in java.lang.Thread
(new Exception()).getStackTrace();
In this way we can avoid throw new Throwable();
upd2
from javadoc
The Throwable class is the superclass
of all errors and exceptions in the
Java language.
So, as a superclass it should be abstract, imho. Using it for getting stacktrace isn't good case by this definition.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
答案已在此处明确说明。
很简单,
getStackTrace()
调用非静态的getOurStackTrace()
方法。如果getStackTrace()
是静态的,那么getOurStackTrace()
也应该是静态的。这种情况不会发生,因为printStackTrace()
方法使用getOurStackTrace()
。 JavaDoc 对此进行了详细说明:java.lang.Throwable 的来源:
另外,如果您阅读
getOurStackTrace()
方法的代码,您会看到它调用以下方法:据我所知,
native
不能是静态的(我可能是错的)。The answer is clearly stated here.
Quite simply, the
getStackTrace()
calls thegetOurStackTrace()
method which is non-static. IfgetStackTrace()
was static, so shouldgetOurStackTrace()
. This won't happen asprintStackTrace()
method uses thegetOurStackTrace()
. This is elaborated in the JavaDoc:Source for java.lang.Throwable:
Also, if you read the code of
getOurStackTrace()
method, you'll see it calls the following method:As far as I know,
native
cannot be static (I may be wrong).我经常使用它来记录日志,所以我很高兴它不是抽象的。有一个方法可以获取调用堆栈,Thread.currentThread().getStackTrace(),但这会返回一个 StackTraceElement[],这对于日志记录来说不是很有用。
编辑:
注意:此方法还可以获取另一个线程的堆栈跟踪,这很方便。
I use it quite often for logging, so I am glad it isn't abstract. There is a method to get the call stack, Thread.currentThread().getStackTrace() but this returns a StackTraceElement[] which isn't very useful for logging.
EDIT:
Note: this method also works to get a stack trace of another thread which can be handy.