溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何避免Java異常作為控制流使用

發(fā)布時間:2022-01-07 14:31:39 來源:億速云 閱讀:178 作者:iii 欄目:編程語言

這篇文章主要講解了“如何避免Java異常作為控制流使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何避免Java異常作為控制流使用”吧!

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

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

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

publicstaticintfindAge(String name) {  try {  String ageAsString = findUser(name);  return ageAsString.length();  } catch (NameNotFoundException e) {  return0;  }  }  privatestaticStringfindUser(String name) {  if(name==null) {  thrownew NameNotFoundException();  }  return name;  }

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

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

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

publicstaticintfindAgeNoEx(String name) {  String ageAsString = findUserNoEx(name);  return ageAsString.length();  }  privatestaticStringfindUserNoEx(String name) {  if(name==null) {  return"";  }  return name;  }

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

publicclassControlFlowWithExceptionOrNot {  publicstaticclassNameNotFoundExceptionextends RuntimeException {  privatestaticfinallong serialVersionUID = 3L;  }  privatestaticfinalint TRIAL = 10000000;  publicstaticvoid main(String[] args) throws InterruptedException {  long start = System.currentTimeMillis();  for (int i = 0; i < TRIAL; i++) {  findAgeNoEx(null);  }  System.out.println("Duration :" + (System.currentTimeMillis() - start));  long start2 = System.currentTimeMillis();  for (int i = 0; i < TRIAL; i++) {  findAge(null);  }  System.out.println("Duration :" + (System.currentTimeMillis() - start2));  };  publicstaticint findAge(String name) {  try {  String ageAsString = findUser(name);  return ageAsString.length();  } catch (NameNotFoundException e) {  return0;  }  }  privatestaticString findUser(String name) {  if (name == null) {  thrownew NameNotFoundException();  }  return name;  }  publicstaticint findAgeNoEx(String name) {  String ageAsString = findUserNoEx(name);  return ageAsString.length();  }  privatestaticString findUserNoEx(String name) {  if (name == null) {  return"";  }  return name;  }  }

輸出:

Duration :16  Duration :6212

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

感謝各位的閱讀,以上就是“如何避免Java異常作為控制流使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何避免Java異常作為控制流使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI