可能的重复: 为什么是in-is-java-lang-throw-a级

你好!我不明白为什么投掷不是抽象类。我只看到其中一个用例:在记录系统中以弄清楚呼叫层次结构。但这可能是该类别或其他类的静态方法。所以为什么?)

谢谢。

UPD

来自Java.util.logging.Logrocord

// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();

为什么不能 Throwable.getStackTrace(); 或如java.lang.thread

(new Exception()).getStackTrace();

这样我们可以避免 throw new Throwable();

UPD2来自Javadoc

可抛出的类是Java语言中所有错误和异常的超类。

因此,作为一个超类,应该是抽象的,恕我直言。根据此定义,将其用于获得StackTrace并不是一个好情况。

有帮助吗?

解决方案

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

答案明确指出 这里.

为什么不能抛出。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 不能静态(我可能错了)。

其他提示

我经常将其用于伐木,所以我很高兴它不是抽象的。有一种方法可以获取调用堆栈,thread.currentthread()。getStackTrace(),但是这返回了stackTraceElement [] [],这对于记录并不是很有用。

编辑:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top