Java 捕获异常时printStackTrace()、toString()、getMessage()、getCause等方法的区别
今日有同事和我交流Java异常捕获时几种信息输出方法的区别,其实我感觉对于这种Java SDK中封装的方法,想弄明白最好的办法就是先看源码(解释都很详细到位),然后再自己写个测试用例看效果。不过既然今天有被问到,就一块写个博客简单供遇到此疑问的其他小伙伴分享下个人所知。
首先贴一下测试代码,很简单,就是造了个空指针异常:
输出信息如下:
I/speech_MainActivity: printStackTraceStart
//printStackTrace()方法输出
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'byte[] java.lang.String.getBytes()' on a null object reference
at com.example.exceptiontest.MainActivity.catchTest(MainActivity.java:111)
at com.example.exceptiontest.MainActivity$2.run(MainActivity.java:80)
at java.lang.Thread.run(Thread.java:818)
I/speech_MainActivity: printStackTraceEnd//toString()方法输出
exceptionToString:java.lang.NullPointerException: Attempt to invoke virtual method 'byte[] java.lang.String.getBytes()' on a null object reference//getMessage()方法输出
exceptionMessage:Attempt to invoke virtual method 'byte[] java.lang.String.getBytes()' on a null object reference//getCause()方法输出
exceptionCause:null
根据以上输出结果及SDK源码注释,几个方法的作用分别如下:
(1)toString()
输出异常类型、错误信息。
(2)getCause()
返回此可抛出事件的原因,如果原因不存在或未知,则返回null。
(3)getMessage()
输出错误信息。
(4)printStackTrace()
这个方法打印的最全, 它会在错误输出流上将此{@code Throwable}对象的堆栈跟踪具体信息打印出来。 输出的第一行便是使用此对象利用toString()方法得到的结果。简单说就是会打印出具体错误信息,包含发生异常的代码位置、异常类型等。