2017-02-09 109 views
-2

爲什麼此代碼允許獲取類名?使用Throwable獲取類名稱

我宣佈與靜態方法的類(它時並不需要必須是靜態的BTW)

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?

+1

我想這是因爲你實際上沒有一個調用堆棧?主執行已經在基礎級別上了? – vegaasen

回答

2

第一個版本工作,因爲t.getStackTrace()返回一個陣列,其中所述第一元件(元件0)是當前方法(JavaSample.getClassName)和第二元件(元件1)是呼叫方(HelloWorld.main)。在第二個版本中,你沒有調用者,堆棧跟蹤只包含一個元素(元素0),因此在引用不存在的元素1時會得到一個異常。

沒有必要創建一個Throwable只是爲了獲得堆棧跟蹤。您可以撥打Thread.currentThread().getStackTrace()來獲得。

1

在第一種情況下,堆棧跟蹤包含函數getClassName()和main()。在第二種情況下,只有main(),因此堆棧跟蹤只包含一個條目,並且t.getStackTrace()[1]產生一個錯誤。