为什么这段代码允许获取类名?
我用静态方法声明一个类(不需要是静态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?
答案 0 :(得分:2)
第一个版本有效,因为t.getStackTrace()
返回一个数组,其中第一个元素(元素0)是当前方法(JavaSample.getClassName
),第二个元素(元素1)是调用者({{1 }})。在第二个版本中,您没有调用者,并且堆栈跟踪只包含一个元素(元素0),因此在引用不存在的元素1时会出现异常。
不需要创建HelloWorld.main
来获取堆栈跟踪。您可以致电Throwable
。
答案 1 :(得分:1)
在第一种情况下,堆栈跟踪包含函数getClassName()和main()。在第二种情况下,只有main(),因此堆栈跟踪只包含一个条目,t.getStackTrace()[1]引发错误。