小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java Puzzlers(4)異常之謎...

 ShangShujie 2007-05-03

周末了,有時(shí)間更新一下。周末好象也沒(méi)什么特別,除了多睡點(diǎn)和看看書(shū)之外,無(wú)事可做,可憐的單身生涯。

異常,復(fù)雜的話題了。

一。首先看看下面這個(gè)例子,到底返回true還是false呢?還是根本編譯不通過(guò):

public class Indecisive {
    public static void main(String[] args) {
        System.out.println(decision());
    }

    static boolean decision() {
        try {
           return true;
        } finally {
            return false;
        }
    }
}

答 案是false,finaly語(yǔ)句塊總是在程序控制權(quán)從try塊離開(kāi)時(shí)開(kāi)始執(zhí)行,無(wú)論try語(yǔ)句塊中是以正常方式或者意外行為結(jié)束。當(dāng)try塊與 finaly塊都以意外方式結(jié)束,整個(gè)try..finaly的意外結(jié)束的原因?qū)⑴cfinaly語(yǔ)句塊意外結(jié)束的原因相同,即try塊意外結(jié)束的原因?qū)⒈? 拋棄。對(duì)于finaly的使用,需要記?。?/p>

每一個(gè)finaly語(yǔ)句塊都應(yīng)該被正常結(jié)束,除非拋出非受控異常。在finaly語(yǔ)句塊中不應(yīng)該使用break,continue,return或者throw來(lái)退出,不應(yīng)當(dāng)讓受控異常傳播到finaly之外。

等等,我們?cè)賮?lái)看個(gè)例子,下面的finaly塊會(huì)被執(zhí)行嗎??

public class HelloGoodbye {
    public static void main(String[] args) {
        try {
            System.out.println("Hello world");
            System.exit(0);
        } finally {
            System.out.println("Goodbye world");
        }
    }
}

很 抱歉,它只打印:Hello World,finaly語(yǔ)句并沒(méi)有被執(zhí)行,這是為何?這是因?yàn)镾ystem.exit方法將立刻終止當(dāng)前程序的所有線程,使得finaly塊根本沒(méi)機(jī)會(huì) 被調(diào)用。System.exit執(zhí)行兩步操作,首先就是停止當(dāng)前所有線程,其次就是在關(guān)閉VM之前執(zhí)行Shut down Hook(關(guān)閉掛鉤)。如果我們希望在VM關(guān)閉之前執(zhí)行一些操作,這些操作應(yīng)該在Runtime.addShutDownHook上注冊(cè),因此,上面的程 序可以修改為:

public class HelloGoodbye {
    public static void main(String[] args) {
  
       System.out.println("Hello world");
       Runtime.getRuntime().addShutdownHook(
               new Thread(){
           public void run(){
                System.out.println("Goodbye world");
           }
       });
       System.exit(0);
    }
}

 

二。來(lái)看看一些不可思議的程序。

第一個(gè)程序:

import java.io.IOException;

public class Arcane1 {
    public static void main(String[] args) {
        try {
            System.out.println("Hello world");
        } catch(IOException e) {
            System.out.println("I‘ve never seen println fail!");
        }
    }
}

試著編譯下,sorry,不能通過(guò)。報(bào)錯(cuò):

在相應(yīng)的try語(yǔ)句主體中不能拋出異常java.io.IOException

錯(cuò)誤信息已經(jīng)很明顯地告訴我們?cè)蛄?,System.out.println方法并不能拋出受控異常IOException。這在JAVA語(yǔ)言規(guī)范中已經(jīng)有描述,如果catch所捕捉的受控異常在try塊里并不能被拋出,這將是一個(gè)編譯期錯(cuò)誤!

第2個(gè)程序:

public class Arcane2 {
    public static void main(String[] args) {
        try {
        } catch(Exception e) {
            System.out.println("This can‘t happen");
        }
    }
}

編譯竟然通過(guò)了,這不是跟我們第一個(gè)程序得到的結(jié)論有矛盾??這又是因?yàn)镴AVA語(yǔ)言規(guī)范所決定的,捕獲Exception或者Throwable的catch語(yǔ)句都是合法,不管他們的try塊語(yǔ)句的內(nèi)容是什么。特例,特例^_^

第3個(gè)程序,有點(diǎn)長(zhǎng)了,首先定義3個(gè)接口:

interface Type1 {
    void f() throws CloneNotSupportedException;
}

interface Type2 {
    void f() throws InterruptedException;
}

interface Type3 extends Type1, Type2 {
}

接口Type3繼承Type1,Type2(JAVA中接口是可以多重繼承的),Type1,Type2的f()方法各拋出一個(gè)受控異常。接著看:

public class Arcane3 implements Type3 {
    public void f() {
        System.out.println("Hello world");
    }

    public static void main(String[] args) {
        Type3 t3 = new Arcane3();
        t3.f();
    }
}

編 譯通過(guò),打印Hello World!可是我明明聲明了兩個(gè)受控異常啊,怎么實(shí)現(xiàn)類(lèi)都不用處理了??不是要放在一個(gè)try..catch塊里面才行??原因就在于一個(gè)方法可以拋出 的受控異常的集合是它所適用所有類(lèi)型(即父類(lèi)型,此例中的Type1,Type2)聲明要拋出的受控異常的交集,而不是并集!

 

三。初始化與異常。構(gòu)造函數(shù)必須聲明其實(shí)例初始化操作中會(huì)拋出的所有受控異常。類(lèi)中值域的初始化操作是在調(diào)用構(gòu)造函數(shù)之前發(fā)生的。不要濫用異常,比如使用異常去控制循環(huán),應(yīng)該只為異常條件而使用異常。

四。刪除類(lèi),書(shū)中的謎題44,我不能完全理解,待續(xù),如有朋友有好的見(jiàn)解,最好共享下。

五。以一個(gè)看似會(huì)無(wú)限循環(huán)的遞歸程序結(jié)尾,其實(shí)因?yàn)镴VM的棧的深度有限,此程序總會(huì)終結(jié),可時(shí)間恐怕要在你我骨灰已經(jīng)歷N個(gè)物質(zhì)循環(huán)之后:

public class Workout {
    public static void main(String[] args) {
        workHard();
        System.out.println("It‘s nap time.");
    }

    private static void workHard() {
        try {
            workHard();
        } finally {
            workHard();
        }
    }
}



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=726869

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多