<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [Java異常處理的10個最佳實踐](http://www.importnew.com/20139.html) [TOC=1,3] 異常處理在編寫健壯的 Java 應用中扮演著非常重要的角色。異常處理并不是功能性需求,它需要優雅地處理任何錯誤情況,比如資源不可用、非法的輸入、null 輸入等等。Java 提供很多異常處理特性,通過內置的 try、catch、finally關鍵字實現。Java 同樣允許創建新的異常和使用 throw 和 throws 拋出該異常。在實踐中,異常處理不單單是知道語法這么簡單。編寫健壯的代碼更像是一種藝術,而不是一門科學,在接下來的文章中,我們將討論 Java 異常處理的最佳實踐。這些最佳實踐遵循標準的 JDK 庫,以及幾個開源代碼庫,來更好地應對錯誤和異常處理。這還是為 Java 程序員提供的編寫健壯代碼的袖珍參考手冊。 **編程中異常處理的最佳實踐** 這里是我收集的 Java 編程中異常處理的 10 個最佳實踐。大家對 Java 中的受檢異常(checked Exception)褒貶不一,這種語言特性要求該異常必須被處理。在本文中,我們盡可能少使用受檢異常,同時也要學會在 Java 編程中,區別使用受檢和非受檢異常。 1)為可恢復的錯誤使用受檢異常,為編程錯誤使用非受檢異常。 對 Java 開發者來說,選擇受檢還是非受檢異常總是讓人感到困惑。受檢異常保證你會針對錯誤情況提供異常處理代碼,這是一種從語言層面上強制你編寫健壯代碼的一種方式,但同時也引入大量雜亂的代碼并導致其可讀性變差。當然,如果你有可替代方式或恢復策略的話,捕獲異常并做處理看起來似乎也合情合理。在 Java 編程中選擇受檢異常還是運行時異常的更多信息,請參考 checked vs unchecked exceptions。 2)在 finally 程序塊中關閉或者釋放資源 這是 Java 編程中一個廣為人知的最佳實踐和一個事實上的標準,尤其是在處理網絡和 IO 操作的時候。在 finally 塊中關閉資源能保證無論是處于正常還是異常執行的情況下,資源文件都能被合理釋放,這由 finally 語句塊保證。從 Java7 開始,新增加了一項更有趣的功能:自動資源管理,或者稱之為ARM塊。盡管如此,我們仍然要記住在 finally 塊中關閉資源,這對于釋放像 FileDescriptors 這類資源至關重要,因為它在 socket 和文件操作中都會被用到。 3)在堆棧信息中包含引起異常的原因 Java 庫和開源代碼在很多情況下會將一種異常包裝成另一種異常。這樣記錄和打印根異常就變得非常重要。Java 異常類提供了 getCause() 方法來獲取導致異常的原因,這可以提供更多有關異常發生的根本原因的信息。這條實踐對調試或排除故障大有幫助。在把一個異常包裝成另一種異常時,記住需要把源異常傳遞給新異常的構造器。 4)始終提供異常的有意義的完整信息 異常信息是最重要的,在其中,你能找到問題產生的原因,因為這是出問題后程序員最先看到的地方。記得始終提供精確的真實的信息。例如,對比下面兩條 IllegalArgumentException 的異常信息: message 1: “Incorrect argument for method” message 2: “Illegal value for ${argument}: ${value} 第一條消息僅說明了參數是非法的或不正確的,但第二條消息包括了參數名和非法值,這對找到錯誤原因很重要。在編寫異常處理代碼的時候,應當始終遵循該 Java 最佳實踐。 5)避免過度使用受檢異常 受檢異常的強制性在某種程度上具有一定的優勢,但同時它也使得代碼可讀性變差,混淆了正常的業務邏輯代碼。你可以通過適度使用受檢異常來最大限度地減少這類情況的發生,這樣可以得到更簡潔的代碼。你同樣可以使用 Java7 的新功能,比如在一個catch語句中捕獲多個異常,以及自動管理資源,以此來移除一些冗余的代碼。 6)將受檢異常轉為運行時異常 這是在諸如 Spring 之類的框架中用來減少使用受檢異常的方式之一,大部分 JDBC 的受檢異常都被包裝進 DataAccessException 中,DataAccessException異常是一種非受檢異常。這個最佳實踐帶來的好處是可以將特定的異常限制到特定的模塊中,比如把 SQLException 拋到 DAO 層,把有意義的運行時異常拋到客戶端層。 7)記住異常的性能代價高昂 需要記住的一件事是異常代價高昂,同時讓代碼運行緩慢。假如你有一個方法從 ResultSet 中進行讀取,它經常會拋出 SQLException 而不是將 cursor 移到下一元素,這將會比不拋出異常的正常代碼執行的慢的多。因此最大限度的減少不必要的異常捕捉,去修復真正的根本問題。不要僅僅是拋出和捕捉異常,如果你能使用 boolean 變量去表示執行結果,可能會得到更整潔、更高性能的解決方案。修正錯誤的根源,避免不必要的異常捕捉。 8)避免空的 catch 塊 沒有什么比空的 catch 塊更糟糕的了,因為它不僅隱藏了錯誤和異常,同時可能導致你的對象處于不可用狀態或者臟狀態。空的 catch 塊沒有意義,除非你非常肯定異常不會以任何方式影響對象的狀態,但在程序執行期間,用日志記錄錯誤依然是最好的方法。這在 Java 異常處理中不僅僅是一個最佳實踐,而且是一個最通用的實踐。 9)使用標準異常 第九條最佳實踐是建議使用標準和內置的 Java 異常。使用標準異常而不是每次創建我們自己的異常,這對于目前和以后代碼的可維護性和一致性,都是最好的選擇。重用標準異常使代碼可讀性更好,因為大部分 Java 開發人員對標準的異常更加熟悉,比如 JDK 中的RuntimeException,IllegalStateException,IllegalArgumentException,NullPointerException,他們能立馬知道每種異常的目的,而不是在代碼或文檔里查找用戶自定義異常的目的。 10)為方法拋出的異常編寫文檔 Java 提供了 throw 和 throws 關鍵字來拋出異常,在 javadoc 中可以用@throw 為任何可能被拋出的異常編寫文檔。如果你編寫 API 或者公共接口,這就變得非常重要。當任何方法拋出的異常都有相應的文檔記錄時,就能潛在的提醒任何調用該方法的開發者。 以上這些就是所有在 Java 異常處理需要遵循的最佳實踐。如果你有異常處理更好的最佳實踐,請務必讓我們知道。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看