![](/img/trans.png)
[英]Log4j2: How can I get Class Name and Line Number without using Throwable?
[英]get class name using Throwable
為什么這段代碼允許獲取類名?
我用靜態方法聲明了一個類(不需要是靜態的順便說一句)
class JavaSample {
public static String getClassName() {
final Throwable t = new Throwable();
t.fillInStackTrace();
final String clazz = t.getStackTrace()[1].getClassName();
return clazz;
}
}
如果我然后寫
public class HelloWorld{
public static void main(String []args){
System.out.println(JavaSample.getClassName());
}
}
它返回HelloWorld
類名。 但如果我喜歡這個
public class HelloWorld{
public static void main(String []args){
final Throwable t = new Throwable();
t.fillInStackTrace();
final String clazz = t.getStackTrace()[1].getClassName();
System.out.println(clazz);
}
}
它在t.getStackTrace()[1]
行中拋出ArrayIndexOutOfBoundsException
。
為什么它在我使用Throwable
時返回 classname ?
第一個版本有效,因為t.getStackTrace()
返回一個數組,其中第一個元素(元素 0)是當前方法( JavaSample.getClassName
),第二個元素(元素 1)是調用者( HelloWorld.main
)。 在第二個版本中,您沒有調用者,並且堆棧跟蹤僅包含一個元素(元素 0),因此在引用不存在的元素 1 時會出現異常。
沒有必要創建一個Throwable
來獲取堆棧跟蹤。 您可以通過調用Thread.currentThread().getStackTrace()
來獲取它。
在第一種情況下,堆棧跟蹤包含函數 getClassName() 和 main()。 在第二種情況下,只有 main(),因此堆棧跟蹤只包含一個條目,而 t.getStackTrace()[1] 會引發錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.