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()方法了。


<<:  Day 11 Odoo Actions (ir.actions.act_url)

>>:  <Day11> Contract — 取得指数(Index)资讯

[Day20] Interconnect

今天来与各位介绍云端的 互连网路(Interconnect) 与 对等互联(Peering) 相关服...

2.4.11 Design System - Switches/Toggle

作息的重要性 我大部分的时候可以属於夜猫子类型 但几次实验下来发现 熬夜→睡不饱→上班想睡→花比较...

稽核表撰写实务

上一篇内部稽核讲到 5. 监督作业:进行下列监督作业,以确定本制度之有效性、及时性及确实性: (1)...

【Day30】回顾与完赛心得

大家好,如果你是从第一天就开始看的人,我是真心非常感谢您的陪伴,陪我走过了这疯狂的 30 天,想当...

[Python] 关键字yield和return究竟有什麽不同?

学习Scrapy的过程中碰到 yeild 这个关键字,我使用Python快半年了,还真的是第一次遇到...