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

发布于 2024-10-04 14:42:17 字数 758 浏览 6 评论 0原文

可能重复: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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

轻许诺言 2024-10-11 14:42:17

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

I doesn't understand why Throwable
isn't abstract class.

The answer is clearly stated here.

Why it can't be
Throwable.getStackTrace(); or as in
java.lang.Thread

Quite simply, the getStackTrace() calls the getOurStackTrace() method which is non-static. If getStackTrace() was static, so should getOurStackTrace(). This won't happen as printStackTrace() method uses the getOurStackTrace(). This is elaborated in the JavaDoc:

Provides programmatic access to the
stack trace information printed by
printStackTrace().

Source for java.lang.Throwable:

 public StackTraceElement[] getStackTrace() {
        return (StackTraceElement[]) getOurStackTrace().clone();
    }


Also, if you read the code of getOurStackTrace() method, you'll see it calls the following method:

private native int getStackTraceDepth();

As far as I know, native cannot be static (I may be wrong).

寂寞清仓 2024-10-11 14:42:17

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

编辑:

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

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

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:

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

Note: this method also works to get a stack trace of another thread which can be handy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文