新聞中心
1.關(guān)于”equals()”方法,String可以隨便用一用,JDK貌似很多類都沒(méi)有覆寫equals()方法,慎重使用。順便一說(shuō),Object的equals()方法相當(dāng)于==。自己覆寫equals()方法,步驟三:<1>索引是否相等<2>是否是此類型<3>成員判斷。覆寫equals()方法,要覆寫hashcode()方法。相等的對(duì)象必須具有相等的散列碼。有些集合類都是基于散列值的,如HashMap、HashSet、Hashtable等,是根據(jù)對(duì)象的散列值將其映射到相應(yīng)的散列桶。最后,當(dāng)對(duì)有父類的類重寫equals()方法時(shí),注意調(diào)用super.equals()方法。

成都網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、集團(tuán)成都定制網(wǎng)頁(yè)設(shè)計(jì)等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都柔性防護(hù)網(wǎng)等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶的一致稱贊!
2.在把異常向上拋出時(shí)要注意,如果在catch,finallly中執(zhí)行會(huì)產(chǎn)生異常的語(yǔ)句時(shí),有可能會(huì)覆蓋根源異常。
Java代碼
- Public class Hidden
- {
- public void foo() throws Exception
- {
- try {
- throw new Exception("First Exception"); //1
- }
- catch (Exception e) {
- throw new Exception("Second Exception"); //2
- }
- finally {
- throw new Exception("Third Exception"); //3
- }
- }
- }
3.關(guān)于throws,寫清每一個(gè)異常比寫一個(gè)他們的父類要好,因?yàn)椴东@異常的函數(shù)也許需要針對(duì)不同的異常進(jìn)行操作。
比如void f() throws FileNotFoundException, EOFException, UnsupportedEncodingException
就比void f() throws IOException 要好很多。
當(dāng)調(diào)用f()的函數(shù)處理異常時(shí),碰到第二種情況就只有去看f()的源碼了。
這也沒(méi)神馬好總結(jié)的,JDK就是這么做的,大抵就是這個(gè)原因吧。
4.關(guān)于繼承關(guān)于throws
Java代碼
- interface A {
- void f() throws IOException;
- }
- class B {
- @Override
- void f() …
- }
此時(shí)f()有三種選擇,<1>不拋出任何異常<2>拋出IOException<3>拋出IOException的子類異常<4>有非IOException的子類異常怎么辦?自己內(nèi)部抓住解決之。
原因是,要是不這樣,調(diào)用f()的上層方法不知道要改成神馬樣子,面向接口編程還怎么搞。這些其實(shí)編譯器都會(huì)幫你檢查的,之所以還要說(shuō)是因?yàn)樽⒁獾竭@個(gè)問(wèn)題,了解了些許原因,感覺(jué)對(duì)異常處理突然產(chǎn)生些許感悟。
5.關(guān)于finally,老問(wèn)題隨便寫兩句,用finally確保你的資源釋放。當(dāng)有finally塊存在時(shí),最好不要從try塊中return,否則勿必檢查finally塊不會(huì)影響程序的正常返回。下面代碼必須悲劇的。
Java代碼
- int f() {
- try {
- return 1;
- } finally {
- return 2;
- }
- }
補(bǔ)一點(diǎn),怎么才能不執(zhí)行finally塊中語(yǔ)句呢?在try塊中執(zhí)行到System.exit(0);語(yǔ)句-.-
6.關(guān)于“不要用異??刂屏鞒獭?,印象中有點(diǎn)爭(zhēng)議? 關(guān)鍵在于“流程”二字,這個(gè)流程指什么。這個(gè)流程指的是正常的程序流程,比如《Practical Java》實(shí)踐24里面這個(gè),但是異常的程序流程是可以處理的,比如網(wǎng)絡(luò)程序socket連接連著由于網(wǎng)絡(luò)不穩(wěn)定等原因斷了,捕獲這個(gè)異常,進(jìn)行重新連接或者連接服務(wù)鏡像神馬的,這個(gè)流程就是異常流程,這個(gè)不用異??刂撇缓锰幚砹税?。
7.在構(gòu)造函數(shù)中拋出異常,咋一看,有點(diǎn)怪。稍微一回憶,JDK中的Stream系列構(gòu)造函數(shù)可不都是這樣的么。Why?構(gòu)造函數(shù)沒(méi)有返回值,不能從構(gòu)造函數(shù)獲得傳統(tǒng)的錯(cuò)誤報(bào)告,一旦構(gòu)造函數(shù)失敗,無(wú)法從中返回錯(cuò)誤碼。這么做的好處:如果構(gòu)造函數(shù)產(chǎn)生異常,調(diào)用段也忽略了這個(gè)異常,那么變量的索引就會(huì)指向null,使用時(shí)就會(huì)拋出NullPointerException。如:
Java代碼
- A a = null;
- try {
- a = new A();
- } catch(XXExcption e) {…}
- // 調(diào)用a
- … …
還有一種辦法叫做二段構(gòu)造法,構(gòu)造函數(shù)只處理不會(huì)有異常的部分,會(huì)產(chǎn)生異常的部分抽離出去由另一個(gè)函數(shù)進(jìn)行處理。此時(shí)就必須設(shè)置一個(gè)標(biāo)志位來(lái)顯示該類是否被成功的初始化,但是這造成了在調(diào)用其它函數(shù)的時(shí)候或之前必須檢查此標(biāo)志位(調(diào)用其它函數(shù)的時(shí)候是指檢查標(biāo)志位的工作在每一個(gè)“其它函數(shù)”的內(nèi)部最開(kāi)始的部分)。
對(duì)了,以上討論的類像這種:
Java代碼
- class MyFileInputStream {
- String name;
- FileInputStream fis;
- }
初始化name時(shí)候不會(huì)錯(cuò),而初始化fis時(shí)候會(huì)有FileNotFoundException異常,不管的話會(huì)產(chǎn)生name有值,fis沒(méi)值是null的未完全初始化的情況,導(dǎo)致其它成員方法的一些錯(cuò)誤。
新聞標(biāo)題:彩擊機(jī)的PracticalJava讀后小記(一)
新聞來(lái)源:http://m.fisionsoft.com.cn/article/djjsisd.html


咨詢
建站咨詢
