java中的getStackTrace和printStackTrace的区别

Posted klb561

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的getStackTrace和printStackTrace的区别相关的知识,希望对你有一定的参考价值。

 getStackTrace()返回的是通过getOurStackTrace方法获取的StackTraceElement[]数组,而这个StackTraceElement是ERROR的每一个cause by的信息。

   printStackTrace()返回的是一个void值,但是可以看到其方法内部将当前传入打印流锁住,然后同样通过getOurStackTrace方法获取的StackTraceElement[]数组,只不过printStackTrace()方法直接打印出来了。而getStackTrace()则是得到数组,使用者可以根据自己的需求去得到打印信息,相比printStackTrace()会更细一些。

e.printStackTrace()

try{ 
BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
String inputLine=input.readline();
int i=Integer.parseInt(inputLine).intValue();
}
catch(Exception e){
e.printStackTrace() ;
}

在后面加e.printStackTrace() ;是为什么?

catch(Exception e){
e.printStackTrace() ;
}
当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。
printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)

========================================================================================================

在捕获异常的时候,大家都可能要用到这样的一条语句:e.printStackTrace();

e是Throwable的实例异常对象,用在catch语句中,相当于一个形参,一旦try捕获到了异常,那么就将这个异常信息交给e,由e处理,printStackTrace()是异常类的一个方法。与它重载的方法还有printStackTrace(PrintStream s) 和printStackTrace(PrintWriter s)。

在Throwable类中printStackTrace()内部是这样执行的:

public void printStackTrace() {
        printStackTrace(System.err);

}

它调用了printStackTrace(PrintStream s)方法。err是System类当中的一个静态PrintStream类型字段。所以它能传递进去。

 

public void printStackTrace()将此 throwable 及其追踪输出至标准错误流。此方法将此 Throwable 对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。输出的第一行包含此对象的 toString() 方法的结果。剩余行表示以前由方法 fillInStackTrace() 记录的数据。此信息的格式取决于实现,但以下示例是最常见的:
java.lang.NullPointerException
         at MyClass.mash(MyClass.java:9)
         at MyClass.crunch(MyClass.java:6)
         at MyClass.main(MyClass.java:3)
本示例通过运行以下程序生成:
class MyClass {
     public static void main(String[] args) {
         crunch(null);
     }
     static void crunch(int[] a) {
         mash(a);
     }
     static void mash(int[] b) {
         System.out.println(b[0]);
     }
}

 

还有就是,
catch(Exception e){ e.printStackTrace() ; } 当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,
也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,
也就出现了e.printStackTrace() ;。 printStackTrace()方法的意思是:
在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)

 

    java抛出异常的方法有很多,其中最常用的两个:
    System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常,不过它和另外一个e.printStackTrace()方法不同。后者也是打印出异常,但是它还将显示出更深的调用信息。
    比如说:
A   extends --->   B   extends  ----> C
  当在创建A的过程中出现问题了,我们抛出异常。
   System.out.println(e),除了标准异常外,只打印at A 然后再向外层层输出。
   e.printStackTrace(),除了标准异常外,打印 
at   C
at   B
at   A
.......再向外层调查。 
在向外层调查的情况下,都一样。最后都会回到com.sun.midp.main.Main.main

 
 
 

以上是关于java中的getStackTrace和printStackTrace的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何从java本机接口调用getStackTrace方法(jni)

java 获取调用类的类名和方法名

java 获取调用类的类名和方法名

java 获取 正在执行的方法名

Thread.getStackTrace()有多昂贵?

java中,想记录异常信息,该如何获得发生异常的类名和方法名呢?不要用log4j等。