2017-02-09 43 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]产生一个错误。