使用Throwable获取类名

时间:2017-02-09 11:42:28

标签: java

为什么这段代码允许获取类名?

我用静态方法声明一个类(不需要是静态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);
     }
}

它会在行ArrayIndexOutOfBoundsException中抛出t.getStackTrace()[1]

为什么当我使用Throwable时它会返回classname?

2 个答案:

答案 0 :(得分:2)

第一个版本有效,因为t.getStackTrace()返回一个数组,其中第一个元素(元素0)是当前方法(JavaSample.getClassName),第二个元素(元素1)是调用者({{1 }})。在第二个版本中,您没有调用者,并且堆栈跟踪只包含一个元素(元素0),因此在引用不存在的元素1时会出现异常。

不需要创建HelloWorld.main来获取堆栈跟踪。您可以致电Throwable

答案 1 :(得分:1)

在第一种情况下,堆栈跟踪包含函数getClassName()和main()。在第二种情况下,只有main(),因此堆栈跟踪只包含一个条目,t.getStackTrace()[1]引发错误。