なぜjava.lang.throwableは抽象クラスではないのですか?
-
29-09-2019 - |
質問
可能な複製: なぜis-java-lang-throwable-aクラス
やあ! Throwableが抽象クラスではない理由がわかりません。これらのユースケースは1つだけです。ロギングシステムでは、階層を呼び出すためのロギングシステムです。しかし、これはこのクラスまたは他のクラスの静的な方法になる可能性があります。なぜ?)
ありがとう。
upd
java.util.logging.logrecordから
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
なぜそれができないのか Throwable.getStackTrace();
またはjava.lang.threadのように
(new Exception()).getStackTrace();
このようにして、私たちは避けることができます throw new Throwable();
Upd2Javadocから
スロー可能なクラスは、Java言語のすべてのエラーと例外のスーパークラスです。
したがって、スーパークラスとして、それは抽象的でなければなりません、私見です。この定義では、Stacktraceを取得するために使用することは良いケースではありません。
解決
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
静的にすることはできません(私は間違っているかもしれません)。
他のヒント
ロギングに頻繁に使用するので、抽象的ではないことを嬉しく思います。コールスタック、thread.currentthread()を取得する方法があります。GetStackTrace()しかし、これはロギングにあまり役に立たないStackTraceElement []を返します。
編集:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
注:この方法は、便利な別のスレッドのスタックトレースを取得するためにも機能します。