精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java異常處理的陋習展播

開發 后端
你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段代碼中,你能夠迅速找出異常處理的六個問題嗎?

你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段代碼中,你能夠迅速找出異常處理的六個問題嗎?

  1. OutputStreamWriter out = ...  
  2. java.sql.Connection conn = ...  
  3. try { // ⑸  
  4.   Statement stat = conn.createStatement();  
  5.   ResultSet rs = stat.executeQuery(  
  6.    "select uid, name from user");  
  7.   while (rs.next())  
  8.   {  
  9.    out.println("ID:" + rs.getString("uid"// ⑹  
  10.     ",姓名:" + rs.getString("name"));  
  11.   }  
  12.   conn.close(); // ⑶  
  13.   out.close();  
  14.  }  
  15.  catch(Exception ex) // ⑵  
  16.  {  
  17.   ex.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(Exception ex)語句。但實際上,在絕大多數情況下,這種做法不值得提倡。為什么呢?

要理解其原因,我們必須回顧一下catch語句的用途。catch語句表示我們預期會出現某種異常,而且希望能夠處理該異常。異常類的作用就是告訴 Java編譯器我們想要處理的是哪一種異常。由于絕大多數異常都直接或間接從java.lang.Exception派生,catch(Exception ex)就相當于說我們想要處理幾乎所有的異常。

再來看看前面的代碼例子。我們真正想要捕獲的異常是什么呢?最明顯的一個是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關鍵詞。

[[103459]] 

 

反例之四:不說明異常的詳細信息

代碼:3行-18行。

仔細觀察這段代碼:如果循環內部出現了異常,會發生什么事情?我們可以得到足夠的信息判斷循環內部出錯的原因嗎?不能。我們只能知道當前正在處理的類發生了某種錯誤,但卻不能獲得任何信息判斷導致當前錯誤的原因。

printStackTrace的堆棧跟蹤功能顯示出程序運行到當前類的執行流程,但只提供了一些最基本的信息,未能說明實際導致錯誤的原因,同時也不易解讀。

因此,在出現異常時,最好能夠提供一些文字信息,例如當前正在執行的類、方法和其他狀態信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。

結論四:在異常處理模塊中提供適量的錯誤原因信息,組織錯誤信息使其易于理解和閱讀。

反例之五:過于龐大的try塊 

代碼:3行-14行。

經常可以看到有人把大量的代碼放入單個try塊,實際上這不是好習慣。這種現象之所以常見,原因就在于有些人圖省事,不愿花時間分析一大塊代碼中哪幾行代碼會拋出異常、異常的具體類型是什么。把大量的語句裝入單個巨大的try塊就象是出門旅游時把所有日常用品塞入一個大箱子,雖然東西是帶上了,但要找出來可不容易。

一些新手常常把大量的代碼放入單個try塊,然后再在catch語句中聲明Exception,而不是分離各個可能出現異常的段落并分別捕獲其異常。這種做法為分析程序拋出異常的原因帶來了困難,因為一大段代碼中有太多的地方可能拋出Exception。

結論五:盡量減小try塊的體積。

反例之六:輸出數據不完整

代碼:7行-11行。

不完整的數據是Java程序的隱形殺手。仔細觀察這段代碼,考慮一下如果循環的中間拋出了異常,會發生什么事情。循環的執行當然是要被打斷的,其次,catch塊會執行??就這些,再也沒有其他動作了。已經輸出的數據怎么辦?使用這些數據的人或設備將收到一份不完整的(因而也是錯誤的)數據,卻得不到任何有關這份數據是否完整的提示。對于有些系統來說,數據不完整可能比系統停止運行帶來更大的損失。

較為理想的處置辦法是向輸出設備寫一些信息,聲明數據的不完整性;另一種可能有效的辦法是,先緩沖要輸出的數據,準備好全部數據之后再一次性輸出。

結論六:全面考慮可能出現的異常以及這些異常對執行流程的影響。

改寫后的代碼

根據上面的討論,下面給出改寫后的代碼。也許有人會說它稍微有點啰嗦,但是它有了比較完備的異常處理機制。

  1. OutputStreamWriter out = ...  
  2. java.sql.Connection conn = ...  
  3. try {  
  4.  Statement stat = conn.createStatement();  
  5.  ResultSet rs = stat.executeQuery(  
  6.   "select uid, name from user");  
  7.  while (rs.next())  
  8.  {  
  9.   out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));  
  10.  }  
  11. }  
  12. catch(SQLException sqlex)  
  13. {  
  14.  out.println("警告:數據不完整");  
  15.  throw new ApplicationException("讀取數據時出現SQL錯誤", sqlex);  
  16. }  
  17. catch(IOException ioex)  
  18. {  
  19.  throw new ApplicationException("寫入數據時出現IO錯誤", ioex);  
  20. }  
  21. finally 
  22. {  
  23.  if (conn != null) {  
  24.   try {  
  25.    conn.close();  
  26.   }  
  27.   catch(SQLException sqlex2)  
  28.   {  
  29.    System.err(this.getClass().getName() + ".mymethod - 不能關閉數據庫連接: " + sqlex2.toString());  
  30.   }  
  31.  }  
  32.    
  33.  if (out != null) {  
  34.   try {  
  35.    out.close();  
  36.   }  
  37.   catch(IOException ioex2)  
  38.   {  
  39.    System.err(this.getClass().getName() + ".mymethod - 不能關閉輸出文件" + ioex2.toString());  
  40.   }  
  41.  }  

本文的結論不是放之四海皆準的教條,有時常識和經驗才是最好的老師。如果你對自己的做法沒有百分之百的信心,務必加上詳細、全面的注釋。

另一方面,不要笑話這些錯誤,不妨問問你自己是否真地徹底擺脫了這些壞習慣。即使最有經驗的程序員偶爾也會誤入歧途,原因很簡單,因為它們確確實實帶來了“方便”。所有這些反例都可以看作Java編程世界的惡魔,它們美麗動人,無孔不入,時刻誘惑著你。也許有人會認為這些都屬于雞皮蒜毛的小事,不足掛齒,但請記住:勿以惡小而為之,勿以善小而不為。

原文鏈接:http://blog.jobbole.com/30230/

責任編輯:林師授 來源: 伯樂在線
相關推薦

2012-12-21 10:48:20

Java異常

2018-08-20 16:25:48

編程語言Java異常處理

2023-12-11 14:19:00

Java程序異常

2011-04-06 10:52:51

Java異常處理

2023-10-10 13:23:18

空指針異常Java

2009-10-26 16:42:27

外企面試陋習

2013-04-07 10:01:26

Java異常處理

2020-07-02 22:42:18

Java異常編程

2009-06-25 14:05:40

Java應用技巧

2010-08-31 11:01:56

JavaJava內存管理

2020-06-14 14:51:27

Java數據開發

2011-04-06 10:27:46

Java異常處理

2018-02-06 09:05:25

Java異常處理代碼

2017-06-02 10:25:26

Java異常處理

2023-05-28 13:09:47

Java異常應用

2011-07-05 10:20:38

java

2010-10-09 16:40:52

2013-08-22 17:10:09

.Net異常處理

2023-12-27 07:53:08

全局異常處理處理應用

2016-12-15 13:31:20

Java異常處理經驗
點贊
收藏

51CTO技術棧公眾號

在线天堂资源www在线污| 国产乱人乱偷精品视频| 九九热播视频在线精品6| 欧美日韩国产精品一区二区不卡中文| 狠狠久久综合婷婷不卡| 中文字幕免费视频观看| 国产精品99久久| 亚洲精品在线电影| 情侣黄网站免费看| 麻豆网在线观看| www.99精品| 91久久精品国产91久久| 国产精品久久久久久99| 五月精品视频| 亚洲老头同性xxxxx| 在线视频一二区| 日韩大片欧美大片| 亚洲一区二区三区小说| 午夜精品一区二区三区在线观看| 中国一级特黄视频| 亚洲第一区色| 日韩在线免费观看视频| a视频免费观看| 亚洲精品黑牛一区二区三区| 色婷婷国产精品综合在线观看| 日韩在线视频在线| 看女生喷水的网站在线观看| 91日韩在线专区| 91传媒视频在线观看| 中文字幕免费观看视频| 国产免费成人| 高清视频欧美一级| 国产一区二区精彩视频| 日韩欧美自拍| 亚洲一区999| 亚洲一区二区三区综合| 中文字幕一区二区三区中文字幕| 欧美在线free| 免费日韩视频在线观看| 日本不卡1234视频| 午夜成人在线视频| 欧美又粗又长又爽做受| 午夜激情在线| 亚洲欧美激情小说另类| 一区二区三区不卡在线| 成人性爱视频在线观看| 久久久久国产精品麻豆ai换脸 | 精品国产乱子伦| 亚洲国产午夜| 欧美激情精品久久久久久黑人| 欧美视频一区二区在线| 欧美日韩在线播放视频| 亚洲无线码在线一区观看| 大黑人交xxx极品hd| 久久精品国产亚洲5555| 亚洲成人激情视频| 日韩精品人妻中文字幕有码| 哺乳挤奶一区二区三区免费看| 日韩一本二本av| 中文字幕人妻一区| 精品国产一区二区三区不卡蜜臂| 精品免费视频一区二区| 特级特黄刘亦菲aaa级| 337p粉嫩大胆噜噜噜鲁| 国产精品毛片一区二区在线看舒淇| 欧美aⅴ一区二区三区视频| 国产成人欧美在线观看| 中文字幕精品无码亚| 紧缚奴在线一区二区三区| 91精品综合视频| www.超碰在线.com| 成人精品高清在线| 久久精品国产综合精品| 免费理论片在线观看播放老| 国产欧美精品一区| 性做爰过程免费播放| 国产亚av手机在线观看| 日韩欧美国产中文字幕| 无需播放器的av| 白嫩亚洲一区二区三区| 欧美精品一区二区三区蜜桃 | 中文字幕黄色av| 国产精品一卡二卡| 久久精品ww人人做人人爽| 国产人成在线观看| 亚洲精品乱码久久久久久| www.国产在线视频| 激情亚洲影院在线观看| 日韩一区二区三区四区| 日韩综合第一页| av永久不卡| 九九热r在线视频精品| 毛片视频网站在线观看| 精品一区在线看| 国内成+人亚洲| 午夜在线小视频| 亚洲一区二区三区三| 国产97色在线 | 日韩| 精品国产三区在线| 亚洲美女av在线| 午夜精品福利在线视频| 先锋a资源在线看亚洲| 国产日韩欧美在线看| 婷婷五月综合久久中文字幕| 粉嫩aⅴ一区二区三区四区五区 | v天堂中文在线| 98精品久久久久久久| 26uuu久久噜噜噜噜| 一女二男一黄一片| 久久综合久色欧美综合狠狠| 日本丰满大乳奶| 浪潮色综合久久天堂| 精品久久久久香蕉网| 色www亚洲国产阿娇yao| 一本不卡影院| 成人一区二区三区四区| h视频在线播放| 欧美视频中文字幕在线| 日韩av成人网| 欧美大人香蕉在线| 国产成人亚洲综合青青| 日本美女一级视频| 亚洲美腿欧美偷拍| 色天使在线观看| 少妇精品久久久一区二区三区| 欧美激情精品久久久久久大尺度| 一级黄色大片网站| 国产欧美va欧美不卡在线| 国产精品扒开腿做| 国产老女人乱淫免费| 国产欧美精品一区二区色综合朱莉| 999在线观看视频| 日本一区二区乱| 久久精品视频在线观看| 国产美女www| 久久色中文字幕| 无码播放一区二区三区| 国产精品欧美大片| 欧美日韩电影在线观看| jizz中国女人| 亚洲日本在线观看| 久久久久久蜜桃一区二区| 国产亚洲精品美女久久久久久久久久| 97精品国产97久久久久久免费| 国产成人久久精品77777综合| 国产精品夫妻自拍| 最新免费av网址| 三上亚洲一区二区| 国产久一一精品| 91caoporn在线| 欧美午夜电影网| 色撸撸在线视频| 精品制服美女丁香| 正在播放亚洲| 日韩成人在线观看视频| 色综合天天狠天天透天天伊人| 国产精品久久久久久免费免熟| 18成人在线观看| 182午夜视频| 欧美在线1区| 国产伦精品一区二区三毛| bbw在线视频| 亚洲欧美www| 国产免费www| 最近日韩中文字幕| 少妇丰满尤物大尺度写真| 欧美欧美全黄| 久久一区免费| 欧美与亚洲与日本直播| 日韩中文在线中文网三级| 国产乱叫456在线| 亚洲一区二区三区三| 天天插天天射天天干| 丝袜美腿亚洲一区| 中文字幕一区综合| 欧美影院视频| 欧美一级视频在线观看| аⅴ资源新版在线天堂| 欧美精品vⅰdeose4hd| 毛片aaaaa| 久久久久久**毛片大全| 手机免费av片| 亚洲日本久久| 亚洲精品成人久久久998| 国产在线一区不卡| 97超碰蝌蚪网人人做人人爽| lutube成人福利在线观看| 日韩午夜激情视频| 亚洲视频 欧美视频| 亚洲色图在线视频| 朝桐光av一区二区三区| 久久99国产精品免费网站| 国产精品一线二线三线| 精品国产精品国产偷麻豆| 91在线免费网站| 中文字幕 在线观看| 久久九九免费视频| 玖玖综合伊人| 欧美成人精品1314www| 无码人妻丰满熟妇精品区| 最新欧美精品一区二区三区| 国产人成视频在线观看| 免费在线观看一区二区三区| 国产无限制自拍| 亚洲欧洲中文字幕| 欧美一区免费视频| 老司机亚洲精品一区二区| 日韩av免费在线看| 牛牛精品在线| 搡老女人一区二区三区视频tv| 深爱五月激情五月| 欧美一区午夜视频在线观看| 麻豆成人免费视频| 亚洲第一福利一区| 麻豆精品一区二区三区视频| 久久毛片高清国产| 国产精品熟妇一区二区三区四区| 久久激五月天综合精品| 日韩精品―中文字幕| 欧美激情成人在线| 一区二区免费在线观看| 国产成人精品三级高清久久91| 99久久99久久精品国产片| 欧美日韩破处视频| 国产成人精品网站| 自拍一区在线观看| 国外视频精品毛片| 青青在线视频| 久久艳片www.17c.com| 在线观看黄av| 最近2019中文字幕大全第二页| 日av在线播放| 日韩电影大片中文字幕| 日韩中文字幕影院| 精品国产免费久久| 亚洲精品久久久久久久久久久久久久| 欧美日韩不卡在线| 6—12呦国产精品| 欧美日韩一区二区三区四区五区| 99久久久久久久久| 色先锋资源久久综合| 国产剧情在线视频| 欧美日韩中文在线观看| 日韩黄色一级大片| 欧美日韩国产一中文字不卡| 久一视频在线观看| 亚洲韩国一区二区三区| 亚洲视频免费播放| 欧美视频第一页| 不卡av电影在线| 欧美中文字幕一区二区三区亚洲| 日韩精选在线观看| 欧美色视频一区| 在线视频 中文字幕| 欧美日韩精品一区二区三区蜜桃 | 亚洲欧美综合另类中字| 男女污视频在线观看| 国产亚洲精品91在线| 999国产在线视频| 超薄丝袜一区二区| 欧洲精品二区| 日韩av大片在线| 国产91亚洲精品久久久| 91视频国产精品| 91精品日本| 蜜桃av噜噜一区二区三| 日韩电影二区| 一二三在线视频| 亚洲一区欧美激情| 色一情一区二区三区| 国产激情一区二区三区桃花岛亚洲| 男人的天堂免费| 91老师片黄在线观看| a级黄色免费视频| 一区二区三区四区亚洲| 日韩欧美三级视频| 欧美伊人久久大香线蕉综合69| 91麻豆国产在线| 亚洲第一偷拍网| 国产在线色视频| 久久国产精品亚洲| 色偷偷色偷偷色偷偷在线视频| 国产精品美女www爽爽爽视频| 久久在线观看| 美女一区视频| 欧美国产先锋| 能看的毛片网站| 国产大陆a不卡| 成人午夜福利一区二区| 亚洲视频一二区| 精品不卡一区二区| 欧美一卡2卡3卡4卡| 精品一二三区视频| 欧美成人精品激情在线观看| 色偷偷色偷偷色偷偷在线视频| 成人av.网址在线网站| 欧美黄色影院| 大桥未久一区二区| 噜噜噜91成人网| 四虎国产精品永久免费观看视频| 91色视频在线| 国产精品成人免费观看| 欧美午夜电影网| 五月天婷婷激情网| 欧美日韩999| 国产成人精品一区二区三区免费| 国产伦视频一区二区三区| 色综合久久网| 北条麻妃av高潮尖叫在线观看| 国产超碰在线一区| 成年人网站在线观看视频| 色综合色狠狠综合色| 成人高潮片免费视频| 色偷偷偷亚洲综合网另类| 六月婷婷综合| 精品国产免费一区二区三区| 亚洲精品一区二区妖精| 国产av人人夜夜澡人人爽| 91在线你懂得| 毛片a片免费观看| 91精品国产色综合久久| av网页在线| 国产第一区电影| 亚洲男人都懂第一日本| 精品久久一二三| 懂色av一区二区三区免费看| 欧美做爰啪啪xxxⅹ性| 欧美羞羞免费网站| 毛片在线能看| 日本sm极度另类视频| 精品淫伦v久久水蜜桃| 成年人网站国产| 国产98色在线|日韩| 欧美黑人一级片| 91精品欧美福利在线观看| 日本最黄一级片免费在线| 国产精品美女免费| 欧美一区电影| 一区二区三区免费播放| 欧美经典一区二区三区| 中文字幕 亚洲视频| 亚洲网址你懂得| jizz久久久久久| 亚洲资源在线网| 精品一区二区三区日韩| 国语对白在线播放| 日韩一级完整毛片| 手机电影在线观看| 国产精品一区二区不卡视频| 亚洲国产1区| 天堂www中文在线资源| 午夜久久电影网| 欧美日韩在线精品一区二区三区激情综| 91精品国产精品| 久久不见久久见国语| 亚洲色图久久久| 成人欧美一区二区三区白人| 精品人妻av一区二区三区| 久久久久久噜噜噜久久久精品| 东京久久高清| 欧美私人情侣网站| 欧美国产成人在线| 国产深喉视频一区二区| 欧美激情精品久久久久久久变态| 精品福利一区| 国产情侣av自拍| ㊣最新国产の精品bt伙计久久| 国产成人久久精品77777综合| 久久久久久久久久国产| 美女亚洲一区| 热久久久久久久久| 亚洲一区电影777| 国产福利在线| 亚洲在线一区二区| 午夜在线视频观看日韩17c| wwwww黄色| 亚洲成人久久久久| 日本在线精品| 国产精品igao激情视频| www成人在线观看| 国产又粗又猛又黄又爽| 国语自产在线不卡| 日本激情一区| 亚洲麻豆一区二区三区| 在线视频中文字幕一区二区| 黄色网址在线免费播放| 久久99精品久久久久久久青青日本| 日本不卡视频一二三区| 九九热精品免费视频| 国产亚洲人成a一在线v站| 日韩精品一区二区三区中文在线 | 麻豆changesxxx国产| 亚洲美女动态图120秒| 看亚洲a级一级毛片| 久久国产色av免费观看| 伊人一区二区三区| 国产美女性感在线观看懂色av| 91久久极品少妇xxxxⅹ软件| 久久午夜电影| 国产无套内射又大又猛又粗又爽|