溫馨提示×

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

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

JAVA中異常處理使用不當(dāng)該怎么辦

發(fā)布時(shí)間:2021-11-26 10:27:16 來源:億速云 閱讀:115 作者:柒染 欄目:編程語(yǔ)言

JAVA中異常處理使用不當(dāng)該怎么辦,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

★空的 catch 語(yǔ)句塊

  犯這種錯(cuò)誤的人比較少,一般發(fā)生在剛學(xué)會(huì) Java 或者剛參加工作不久的人身上。
  所謂“空 catch 語(yǔ)句塊”就是在 catch 語(yǔ)句塊中沒有對(duì)異常作任何處理(比如記錯(cuò)誤日志),導(dǎo)致異常信息被丟棄/忽略。一旦程序不能正確運(yùn)行,由于查不到任何 log 信息,只好從頭看代碼,靠肉眼找 bug。

★沒有使用 finally

  很多人在 catch 語(yǔ)句之后不使用 finally 語(yǔ)句。由于在 try 語(yǔ)句中可能會(huì)涉及資源的申請(qǐng)和釋放。如果在資源申請(qǐng)之后、資源釋放之前拋出異常,就會(huì)發(fā)生資源泄露。

★籠統(tǒng)的 catch 語(yǔ)句塊

  有些人為了省事,只在自己模塊的最外層代碼包一個(gè) try 語(yǔ)句塊,然后 catch(Exception)。不管捕獲到什么異常,都作統(tǒng)一 log 了事。這種做法比“空 catch 語(yǔ)句塊”稍好,但由于不能對(duì)具體的異常進(jìn)行具體處理,對(duì)一些可恢復(fù)的異常(下面會(huì)提到),喪失了恢復(fù)的機(jī)會(huì)。而且也可能導(dǎo)致上述提到的資源泄露的問題。

★使用函數(shù)返回值進(jìn)行錯(cuò)誤處理

  有些人放著 Java 的異常機(jī)制不用,而用函數(shù)返回值來表示成功/失?。ū热纾悍祷?true 表示成功、false 表示失?。?,簡(jiǎn)直是“捧著金碗要飯”。個(gè)人感覺,從 C 轉(zhuǎn)到 Java 的人比較容易有此毛病。這種做法會(huì)導(dǎo)致如下幾個(gè)問題:
1. 返回值一般用整數(shù)值或布爾值表示,傳遞的信息過于簡(jiǎn)陋;
2. 一旦調(diào)用者忽略了錯(cuò)誤返回碼,就會(huì)導(dǎo)致和“空 catch 語(yǔ)句塊”類似的問題;
2. 對(duì)同一個(gè)函數(shù)的多處調(diào)用,都需要對(duì)返回值進(jìn)行重復(fù)判斷,導(dǎo)致代碼冗余。

★不清楚“Checked Exception”和“Runtime Exception”的區(qū)別

  這個(gè)現(xiàn)象比較普遍,俺發(fā)現(xiàn)很多2年以上 Java 工作經(jīng)驗(yàn)的人尚未完全搞明白兩者的區(qū)別??磥磉@個(gè)問題得詳細(xì)說一下。
當(dāng)初Java的設(shè)計(jì)者有意區(qū)分這兩種異常,是別有深意的。其中“Checked Exception”用于表示可恢復(fù)的異常(也就是你必須檢查的異常);而“Runtime Exception”表示不可恢復(fù)的異常(也就是運(yùn)行時(shí)異常,主要是程序 bug 和致命錯(cuò)誤,你【不需要】檢查)。不過這種做法引來了很多爭(zhēng)議(包括很多 Java 大牛),鑒于本帖子主要針對(duì)新手,以后再專門來聊這個(gè)爭(zhēng)議的話題。
  為了便于理解,下面我舉一個(gè)例子來說明。假設(shè)你要寫一個(gè) Download 函數(shù),根據(jù)傳入的 URL(String 參數(shù))返回對(duì)應(yīng)網(wǎng)頁(yè)的內(nèi)容文本。這時(shí)候有兩種情況你需要處理:
1. 如果傳入的 URL 參數(shù)是 null,這表明該函數(shù)的調(diào)用者出 bug 了,而程序本身的 bug 是很難在運(yùn)行時(shí)自我恢復(fù)的。這時(shí)候 Download 函數(shù)必須拋出 Runtime Exception。并且 Download 函數(shù)的調(diào)用者【不應(yīng)該】嘗試去處理這個(gè)異常,必須讓它【盡早】暴露出來(比如讓 JVM 自己終止運(yùn)行)。
2. 如果傳入的 URL 參數(shù)非 null,但是它包含的字符串不是一個(gè)合法的URL格式(可能由于用戶輸入錯(cuò)誤導(dǎo)致)。這時(shí)候 Download 函數(shù)必須拋出 Checked Exception。并且 Download 函數(shù)的調(diào)用者必須捕獲該異常并進(jìn)行相應(yīng)的處理(比如提示用戶重新輸入 URL)。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

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

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

AI