真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

避免在Java中使用CheckedException(轉(zhuǎn))-創(chuàng)新互聯(lián)

避免在Java中使用Checked Exception(轉(zhuǎn))[@more@]這篇文章指出了Java中checked Exception的一些缺點(diǎn),提出應(yīng)該在程序設(shè)計(jì)中避免使用checked Exception,對(duì)于需要處理checked Exception的代碼,可以使用ExceptionAdapter這個(gè)類(lèi)對(duì)checked Exception進(jìn)行包裝。這篇文章的概念和ExceptionAdapter這個(gè)類(lèi)均源自Bruce Eckel的Does Java need Checked Exception。
Java的Exception分為兩類(lèi),一類(lèi)是RuntimeException及其子類(lèi),另外一類(lèi)就是checked Exception。Java要求函數(shù)對(duì)沒(méi)有被catch處理掉的checked Exception,需要將其寫(xiě)在函數(shù)的聲明部分。然而,這一要求常常給程序員帶來(lái)一些不必要的負(fù)擔(dān)。



為了避免在函數(shù)聲明中寫(xiě)throws部分,在Java項(xiàng)目里面常??梢钥吹揭韵麓a用來(lái)‘吞掉’Exception:
try {

// ...

} catch (Exception ex) {

ex.printStackTrace();

}




這顯然不是一個(gè)好的處理Exception辦法,事實(shí)上,catch并處理一個(gè)Exception意味著讓程序從發(fā)生的錯(cuò)誤(Exception)中恢復(fù)過(guò)來(lái)。從這種意義上說(shuō),已上的代碼只可能在一些很簡(jiǎn)單的情況下工作而不帶來(lái)問(wèn)題。



對(duì)于很多Exception,往往沒(méi)有去處理它并讓程序從錯(cuò)誤中恢復(fù)出來(lái)的辦法,這時(shí)唯一能做的事情可能就是在界面上顯示一些提示信息給用戶(hù)。這種情況下讓程序拋出遇到的Exception是更為合理的做法。然而,這樣做會(huì)使得一些函數(shù)的聲明急劇膨脹。一個(gè)函數(shù)可能需要聲明會(huì)拋出的7、8個(gè) checked Exception,而且每個(gè)調(diào)用它的函數(shù)也需要同樣的聲明。

比這更糟糕的是,這有可能破壞類(lèi)設(shè)計(jì)的open-close原則。簡(jiǎn)單來(lái)說(shuō),open-close原則是指當(dāng)擴(kuò)展一個(gè)模塊的時(shí)候,可以不影響其現(xiàn)有的client。open-close原則是通過(guò)繼承來(lái)實(shí)現(xiàn)的,當(dāng)繼承一個(gè)類(lèi)的時(shí)候,我們既擴(kuò)展了這個(gè)類(lèi),也不會(huì)影響原有的client(因?yàn)閷?duì)這個(gè)類(lèi)沒(méi)有改動(dòng))。



現(xiàn)在考慮下面這種情況,有一個(gè)父類(lèi)Base:

public class Base {



public void foo() throws ExceptionA {

// ...

}

}




現(xiàn)在需要繼承Base這個(gè)類(lèi)并重載foo這個(gè)方法,在新的實(shí)現(xiàn)中,foo可能拋出ExceptionB:
public class Extend extends Base {



public void foo() throws ExceptionB {

// ...

}

}




然而,這樣寫(xiě)在Java里面是不合法的,因?yàn)镴ava把可能會(huì)拋出的Exception看作函數(shù)特征的一部分,子類(lèi)聲明拋出的Exception必須是父類(lèi)的子集。



可以在Base類(lèi)的foo方法中加入拋出ExceptionB的聲明,然而,這樣就破壞了open-close原則。而且,有時(shí)我們沒(méi)有辦法去修改父類(lèi),比如當(dāng)重載一個(gè)Jdk里的類(lèi)的時(shí)候。



另一個(gè)可能的做法是在Extend的foo方法中catch住ExceptionB,然后構(gòu)造一個(gè)ExceptionA并拋出。這是個(gè)可行的辦法但也只是一個(gè)權(quán)宜之計(jì)。



如果使用RuntimeException,這些問(wèn)題都不會(huì)存在。這說(shuō)明checked Exception并不是一個(gè)很實(shí)用的概念,也意味著在程序設(shè)計(jì)的時(shí)候,我們應(yīng)該讓自己的Exception類(lèi)繼承RuntimeException而不是Exception。(這和JDK的建議正好相反,但實(shí)踐證明這樣做代碼的質(zhì)量更好。)



對(duì)于那些需要處理checked Exception的代碼,可以利用一個(gè)ExceptionAdapter的類(lèi)把checked Exception包裝成一個(gè)RuntimeException拋出。ExceptionAdapter來(lái)自Bruce Eckel的Does Java need Checked Exception這篇文章,在這里的ExceptionAdapter是我根據(jù)JDK 1.4修改過(guò)的:

public class ExceptionAdapter extends RuntimeException {



public ExceptionAdapter(Exception ex) {

super(ex);

}



public void printStackTrace(java.io.PrintStream s) {

getCause().printStackTrace(s);

}



public void printStackTrace(java.io.PrintWriter s) {

getCause().printStackTrace(s);

}



// rethrow()的作用是把被包裝的Exception再次拋出。

public void rethrow()

throws Exception

{

throw (Exception) getCause();

}

}
網(wǎng)站標(biāo)題:避免在Java中使用CheckedException(轉(zhuǎn))-創(chuàng)新互聯(lián)
本文來(lái)源:http://weahome.cn/article/ddodhh.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部