日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java:異常作為控制流?大佬:避免!避免!避免

Java是一種通用的編程語言,它有著許多不同的方案去解決一些特殊的問題。然而,其中既有需要被遵循的最佳做法,也有一些仍被普遍使用的不良做法。

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站與策劃設(shè)計(jì),沂源網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:沂源等地區(qū)。沂源做網(wǎng)站價(jià)格咨詢:18980820575

用異常(Exceptions)作為控制流就是這些常見的不良做法中的一種。要避免使用這一方法的原因有二:首先,這會(huì)降低單位時(shí)間內(nèi)代碼的響應(yīng)性能,同時(shí)代碼也會(huì)非常難讀懂。

通過下面這個(gè)例子來看看異常是怎樣被用作控制流的。這個(gè)代碼的商業(yè)用例是:

 
 
 
 
  1. publicstaticintfindAge(String name) {  
  2. try {  
  3. String ageAsString = findUser(name);  
  4. return ageAsString.length();  
  5. } catch (NameNotFoundException e) {  
  6. return0;  
  7. }  
  8. }  
  9. privatestaticStringfindUser(String name) {  
  10. if(name==null) {  
  11. thrownew NameNotFoundException();  
  12. }  
  13. return name;  

如果用戶提供了一個(gè)非空的名字給findAge 方法,那它會(huì)返回這個(gè)名字的長度。但是如果用戶名為空,那么findUser方法會(huì)拋出NameNotFoundException,而在這種情況下,findAge 方法會(huì)返回0。

那該如何重構(gòu)這個(gè)代碼來避免異常呢?

老實(shí)說,有很多種辦法可以實(shí)現(xiàn),這里就只介紹一種。

 
 
 
 
  1. publicstaticintfindAgeNoEx(String name) {  
  2. String ageAsString = findUserNoEx(name);  
  3. return ageAsString.length();  
  4. }  
  5. privatestaticStringfindUserNoEx(String name) {  
  6. if(name==null) {  
  7. return"";  
  8. }  
  9. return name;  

為了找到異常對代碼性能的影響,準(zhǔn)備下面這個(gè)代碼,其中兩種實(shí)現(xiàn)都被執(zhí)行了1000萬次,Intel Core i7-3630QM CPU上運(yùn)行時(shí),異?;ㄙM(fèi)了上千毫秒。

 
 
 
 
  1. publicclassControlFlowWithExceptionOrNot {  
  2. publicstaticclassNameNotFoundExceptionextends RuntimeException {  
  3. privatestaticfinallong serialVersionUID = 3L;  
  4. }  
  5. privatestaticfinalint TRIAL = 10000000;  
  6. publicstaticvoid main(String[] args) throws InterruptedException {  
  7. long start = System.currentTimeMillis();  
  8. for (int i = 0; i < TRIAL; i++) {  
  9. findAgeNoEx(null);  
  10. }  
  11. System.out.println("Duration :" + (System.currentTimeMillis() - start));  
  12. long start2 = System.currentTimeMillis();  
  13. for (int i = 0; i < TRIAL; i++) {  
  14. findAge(null);  
  15. }  
  16. System.out.println("Duration :" + (System.currentTimeMillis() - start2));  
  17. };  
  18. publicstaticint findAge(String name) {  
  19. try {  
  20. String ageAsString = findUser(name);  
  21. return ageAsString.length();  
  22. } catch (NameNotFoundException e) {  
  23. return0;  
  24. }  
  25. }  
  26. privatestaticString findUser(String name) {  
  27. if (name == null) {  
  28. thrownew NameNotFoundException();  
  29. }  
  30. return name;  
  31. }  
  32. publicstaticint findAgeNoEx(String name) {  
  33. String ageAsString = findUserNoEx(name);  
  34. return ageAsString.length();  
  35. }  
  36. privatestaticString findUserNoEx(String name) {  
  37. if (name == null) {  
  38. return"";  
  39. }  
  40. return name;  
  41. }  
  42. }  

輸出:

 
 
 
 
  1. Duration :16  
  2. Duration :6212 

如果來比較一下這兩種findAge方法的可讀性,可以發(fā)現(xiàn)沒有異常的那個(gè)十分清晰,不管findUser方法返回什么,findAge方法都會(huì)得到它的長度,我們也很確信findUser方法會(huì)返回一個(gè)字符串。但是那個(gè)有異常的就會(huì)令人困惑,findUser方法返回不清晰,它可能返回一個(gè)字符串也可能拋出一個(gè)異常,而且這在方法的簽名上是不可見的。正因?yàn)檫@樣,函數(shù)式編程范式中不歡迎異常。

最后,在碰到真正的異常情況時(shí)再使用異常會(huì)比較好。如果你將異常用作控制流,這可能會(huì)導(dǎo)致性能問題,代碼的可讀性也會(huì)減弱。


文章題目:Java:異常作為控制流?大佬:避免!避免!避免
轉(zhuǎn)載來于:http://m.5511xx.com/article/dpddggp.html