亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2SE:六大代碼問題檢驗你的Java知識

2019-11-18 11:35:27
字體:
來源:轉載
供稿:網友
1OutputStreamWriterout=...
2java.sql.Connectionconn=...
3try{//⑸
4Statementstat=conn.createStatement();
5ResultSetrs=stat.executeQuery(
6"selectuid,namefromuser");
7while(rs.next())
8{
9out.10",姓名:"+rs.getString("name"));
11}
12conn.close();//⑶
13out.close();
14}
15catch(Exceptionex)//⑵
16{
17ex.printStackTrace();//⑴,⑷
18}

作為一個Java程序員,你至少應該能夠找出兩個問題。但是,假如你不能找出全部六個問題,請繼續閱讀本文。
本文討論的不是Java異常處理的一般性原則,因為這些原則已經被大多數人熟知。我們要做的是分析各種可稱為“反例”(anti-pattern)的違反優秀編碼規范的常見壞習慣,幫助讀者熟悉這些典型的反面例子,從而能夠在實際工作中敏銳地察覺和避免這些問題。
    反例之一:丟棄異常
    代碼:15行-18行。
     這段代碼捕捉了異常卻不作任何處理,可以算得上Java編程中的殺手。從問題出現的頻繁程度和禍害程度來看,它也許可以和C/C++程序的一個惡名遠播的問題相提并論??不檢查緩沖區是否已滿。假如你看到了這種丟棄(而不是拋出)異常的情況,可以百分之九十九地肯定代碼存在問題(在極少數情況下,這段代碼有存在的理由,但最好加上完整的注釋,以免引起別人誤解)。
這段代碼的錯誤在于,異常(幾乎)總是意味著某些事情不對勁了,或者說至少發生了某些不平常的事情,我們不應該對程序發出的求救信號保持沉默和無動于衷。調用一下printStackTrace算不上“處理異常”。不錯,調用printStackTrace對調試程序有幫助,但程序調試階段結束之后,printStackTrace就不應再在異常處理模塊中擔負主要責任了。
丟棄異常的情形非常普遍。打開JDK的ThreadDeath類的文檔,可以看到下面這段說明:“非凡地,雖然出現ThreadDeath是一種‘正常的情形’,但ThreadDeath類是Error而不是Exception的子類,因為許多應用會捕捉所有的Exception然后丟棄它不再理睬。”這段話的意思是,雖然ThreadDeath代表的是一種普通的問題,但鑒于許多應用會試圖捕捉所有異常然后不予以適當的處理,所以JDK把ThreadDeath定義成了Error的子類,因為Error類代表的是一般的應用不應該去捕捉的嚴重問題。可見,丟棄異常這一壞習慣是如此常見,它甚至已經影響到了Java本身的設計。
那么,應該怎樣改正呢?主要有四個選擇:
1、處理異常。針對該異常采取一些行動,例如修正問題、提醒某個人或進行其他一些處理,要根據具體的情形確定應該采取的動作。再次說明,調用printStackTrace算不上已經“處理好了異?!?。
2、重新拋出異常。處理異常的代碼在分析異常之后,認為自己不能處理它,重新拋出異常也不失為一種選擇。
3、把該異常轉換成另一種異常。大多數情況下,這是指把一個低級的異常轉換成應用級的異常(其含義更輕易被用戶了解的異常)。
4、不要捕捉異常。
     結論一:既然捕捉了異常,就要對它進行適當的處理。不要捕捉異常之后又把它丟棄,不予理睬。
    反例之二:不指定具體的異常
    代碼:15行。
    許多時候人們會被這樣一種“美妙的”想法吸引:用一個catch語句捕捉所有的異常。最常見的情形就是使用catch(Exceptionex)語句。但實際上,在絕大多數情況下,這種做法不值得提倡。為什么呢?
要理解其原因,我們必須回顧一下catch語句的用途。catch語句表示我們預期會出現某種異常,而且希望能夠處理該異常。異常類的作用就是告訴Java編譯器我們想要處理的是哪一種異常。由于絕大多數異常都直接或間接從java.lang.Exception派生,catch(Exceptionex)就相當于說我們想要處理幾乎所有的異常。
     再來看看前面的代碼例子。我們真正想要捕捉的異常是什么呢?最明顯的一個是SQLException,這是JDBC操作中常見的異常。另一個可能的異常是IOException,因為它要操作OutputStreamWriter。顯然,在同一個catch塊中處理這兩種截然不同的異常是不合適的。假如用兩個catch塊分別捕捉SQLException和IOException就要好多了。這就是說,catch語句應當盡量指定具體的異常類型,而不應該指定涵蓋范圍太廣的Exception類。
     另一方面,除了這兩個特定的異常,還有其他許多異常也可能出現。例如,假如由于某種原因,executeQuery返回了null,該怎么辦?答案是讓它們繼續拋出,即不必捕捉也不必處理。實際上,我們不能也不應該去捕捉可能出現的所有異常,程序的其他地方還有捕捉異常的機會??直至最后由JVM處理。
結論二:在catch語句中盡可能指定具體的異常類型,必要時使用多個catch。不要試圖處理所有可能出現的異常。
     反例之三:占用資源不釋放
     代碼:3行-14行。
     異常改變了程序正常的執行流程。這個道理雖然簡單,卻經常被人們忽視。假如程序用到了文件、Socket、JDBC連接之類的資源,即使碰到了異常,也要正確釋放占用的資源。為此,Java提供了一個簡化這類操作的要害詞finally。
finally是樣好東西:不管是否出現了異常,Finally保證在try/catch/finally塊結束之前,執行清理任務的代碼總是有機會執行。遺憾的是有些人卻不習慣使用finally。
     當然,編寫finally塊應當多加小心,非凡是要注重在finally塊之內拋出的異常??這是執行清理任務的最后機會,盡量不要再有難以處理的錯誤。
結論三:保證所有資源都被正確釋放。充分運用finally要害詞。
     反例之四:不說明異常的具體信息
     代碼:3行-18行。
     仔細觀察這段代碼:假如循環內部出現了異常,會發生什么事情?我們可以得到足夠的信息判定循環內部出錯的原因嗎?不能。我們只能知道當前正在處理的類發生了某種錯誤,但卻不能獲得任何信息判定導致當前錯誤的原因。
printStackTrace的堆棧跟蹤功能顯示出程序運行到當前類的執行流程,但只提供了一些最基本的信息,未能說明實際導致錯誤的原因,同時也不易解讀。
     因此,在出現異常時,最好能夠提供一些文字信息,例如當前正在執行的類、方法和其他狀態信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。
結論四:在異常處理模塊中提供適量的錯誤原因信息,組織錯誤信息使其易于理解和閱讀。
     反例之五:過于龐大的try塊
     代碼:3行-14行。
      經??梢钥吹接腥税汛罅康拇a放入單個try塊,實際上這不是好習慣。這種現象之所以常見,原因就在于有些人圖省事,不愿花時間分析一大塊代碼中哪幾行代碼會拋出異常、異常的具體類型是什么。把大量的語句裝入單個巨大的try塊就象是出門旅游時把所有日常用品塞入一個大箱子,雖然東西是帶上了,但要找出來可不輕易。
     一些新手經常把大量的代碼放入單個try塊,然后再在catch語句中聲明Exception,而不是分離各個可能出現異常的段落并分別捕捉其異常。這種做法為分析程序拋出異常的原因帶來了困難,因為一大段代碼中有太多的地方可能拋出Exception。
結論五:盡量減小try塊的體積。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人网av| 久久久久久久久久国产精品| 97精品一区二区三区| 中文字幕自拍vr一区二区三区| 国产精品久久久久久久久久久不卡| 色哟哟入口国产精品| 国产成人精品在线观看| 日韩视频一区在线| 久久国产精品首页| 欧美激情视频免费观看| 久久国产精品视频| 久久6免费高清热精品| 国产成人91久久精品| 色悠久久久久综合先锋影音下载| 亚洲国产精彩中文乱码av| 亚洲精品动漫久久久久| 精品女同一区二区三区在线播放| 日韩大陆毛片av| 国产精品视频区1| 成人免费在线网址| 亚洲风情亚aⅴ在线发布| 欧美电影在线播放| 欧美激情在线观看视频| 久久久国产视频91| 欧洲亚洲妇女av| 欧美人交a欧美精品| 亚洲图片欧洲图片av| 久久久久亚洲精品国产| 亚洲国产日韩欧美在线图片| 色综合久综合久久综合久鬼88| 国产一区二区在线免费视频| 欧美与黑人午夜性猛交久久久| 免费成人高清视频| 欧美日韩午夜视频在线观看| 久久久久久久久久婷婷| 7m精品福利视频导航| 在线观看国产成人av片| 91色中文字幕| 国产免费亚洲高清| 欧美大成色www永久网站婷| 欧美中文字幕在线视频| 色婷婷综合久久久久| 国产精品女人网站| 久久久久五月天| 亚洲第一男人天堂| 成人妇女免费播放久久久| 日韩精品免费在线视频| 欧美精品情趣视频| 成人av番号网| 国产视频精品久久久| 国产精品久久久久久久久久久新郎| 91久久精品美女高潮| 国产盗摄xxxx视频xxx69| 亚洲欧美一区二区三区四区| 97超级碰在线看视频免费在线看| 91极品女神在线| 久久精品99久久久香蕉| 亚洲国产免费av| 亚洲日本中文字幕免费在线不卡| 亚洲成人精品在线| 草民午夜欧美限制a级福利片| 亚洲丁香久久久| 97精品视频在线播放| 亚洲人成网站色ww在线| 亚洲美女免费精品视频在线观看| 亚洲色图激情小说| 国产成人综合一区二区三区| 国内精品美女av在线播放| 色婷婷av一区二区三区在线观看| 日韩在线播放一区| 亚洲乱码一区av黑人高潮| 国产精品久久久久aaaa九色| 国产精品久久久久久亚洲影视| 欧美大成色www永久网站婷| 中文字幕欧美亚洲| 日韩精品久久久久久久玫瑰园| 欧美三级欧美成人高清www| 国产精品免费网站| 欧美高清视频一区二区| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品久久婷婷六月丁香| 久久久国产一区二区| 国产精品日日摸夜夜添夜夜av| 午夜精品久久久久久久久久久久久| 国产成人小视频在线观看| 久久久久久国产三级电影| 国产精品视频导航| 久久久人成影片一区二区三区| 精品视频在线播放免| 日韩av电影手机在线观看| 亚洲一区二区福利| 欧美一级视频免费在线观看| 欧美极品少妇xxxxⅹ免费视频| 久久成人综合视频| 久久免费国产视频| 另类天堂视频在线观看| 国产欧美亚洲视频| 中文在线资源观看视频网站免费不卡| 久久久久久久影视| 亚洲天堂第二页| 色婷婷**av毛片一区| 国产精品网红福利| 性色av一区二区三区在线观看| 久久久噜噜噜久久久| 亚洲成人网在线观看| 国产成人一区二区| 久久久久久有精品国产| 日韩av一区二区在线观看| 精品久久久久久国产| 亚洲精品自在久久| 欧美国产精品人人做人人爱| 成人激情视频在线| 欧美不卡视频一区发布| 91色在线视频| 3344国产精品免费看| 日韩视频在线一区| 日韩在线视频观看| 欧美极品第一页| 精品少妇一区二区30p| 国产日韩欧美在线视频观看| 超碰精品一区二区三区乱码| 久久九九精品99国产精品| 日韩精品视频观看| 日韩网站免费观看| 91国产高清在线| 亚洲在线免费观看| 国产99视频精品免视看7| 奇米成人av国产一区二区三区| 久久久av免费| 欧美在线视频网| 成人黄在线观看| 亚洲人成电影网站色xx| 欧美成人自拍视频| 高清一区二区三区日本久| 亚洲国产欧美精品| 日韩一区二区久久久| 久久中文久久字幕| 韩国v欧美v日本v亚洲| 岛国av在线不卡| 国产在线视频不卡| 国模吧一区二区三区| 久久久久久国产精品久久| 国产精品久久色| 欧美性少妇18aaaa视频| 欧美日韩综合视频| 亚洲国产日韩欧美在线图片| 亚洲激情免费观看| 亚洲网站在线观看| 亚洲美女精品久久| 国产精品亚洲综合天堂夜夜| 国产精品久久久久久久久久小说| 日韩综合中文字幕| 永久免费看mv网站入口亚洲| 国产在线a不卡| 热久久这里只有| 91av免费观看91av精品在线| 国产日韩欧美夫妻视频在线观看| 国产精品久久一区主播| 欧美综合在线观看| 裸体女人亚洲精品一区| 91精品综合久久久久久五月天| 麻豆成人在线看| 国产欧美亚洲视频| 国产日本欧美视频|