雖然現在履歷都會寫自己台大畢業,但我對自身學歷是台大的認同感還是遠不如成大,畢竟好歹也待了4年,而且碩士讀台大真的難度比大學讀台大簡單多了,只要你的科系沒有很酷炫就真的不難。
今天要來談談在我們創建出Exception的try-catch時,IDE會自動幫我們加在catch區塊中的e.printStackTrace()。
在開發時期我們時常在console中查看程式的狀況,printStackTrace()就是一個幫助我們釐清程式例外的好幫手。
若我們寫了以下的程式,大家應該都可以猜得出來console會發生甚麼事:
class ThrowTest{
static void first(){
String str = null;
str.length();
static void second(){
try{
first();
catch(NullPointerException ne){
ne.printStackTrace();
}
public static void main(String[] args){
try{
second();
catch(NullPointerException ne){
ne.printStackTrace();
}
}
}
這樣的話,會印出兩次的printStackTrace()內容。那大家覺得兩次印出來的內容會一樣嗎?畢竟一個是在main方法中發生例外,而在seconnd方法中印的就會比main方法少一層。
答案是這2個printStackTrace()會印出一樣的內容,printStackTrace()一律會將完整的堆疊鍊從程式啟動點到例外發生處。程式啟動點是沒辦法改的,不過我們可以讓例外發生處追蹤到我們想要的地方,只要利用fillInStackTrace()就可以了:
class ThrowTest{
static void first(){
String str = null;
str.length();
}
static void second(){
try{
first();
catch(NullPointerException ne){
ne.printStackTrace();
Throwable thr = ne.fillInStackTrace();
throw (NullPointerException) thr;
}
}
public static void main(String[] args){
try{
second();
catch(NullPointerException ne){
ne.printStackTrace();
}
}
}
這樣的話在main方法中的printStackTrace()就只會追蹤到second()方法了。