iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

Java SE系列 第 13

Day13:窮理致知

雖然現在履歷都會寫自己台大畢業,但我對自身學歷是台大的認同感還是遠不如成大,畢竟好歹也待了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()方法了。


上一篇
Day12:有問題要主動提出來
下一篇
Day14:鐵口直斷
系列文
Java SE30

尚未有邦友留言

立即登入留言