當建立一個異常時,須要收集一個棧跟蹤(stack track),這個棧跟蹤用於描述異常是在何處建立的。構建這些棧跟蹤時須要爲運行時棧作一份快照,正是這一部分開銷很大。編程
當須要建立一個 Exception 時,JVM 不得不說:先別動,我想就您如今的樣子存一份快照,因此暫時中止入棧和出棧操做。棧跟蹤不僅包含運行時棧中的一兩個元素,而是包含這個棧中的每個元素。性能
若是您建立一個 Exception ,就得付出代價,好在捕獲異常開銷不大,所以可使用 try-catch 將核心內容包起來。從技術上講,你甚至能夠隨意地拋出異常,而不用花費很大的代價。設計
招致性能損失的並非 throw 操做——儘管在沒有預先建立異常的狀況下就拋出異常是有點不尋常。真正要花代價的是建立異常,幸運的是,好的編程習慣已教會咱們,不該該無論三七二十一就拋出異常。異常是爲異常的狀況而設計的,使用時也應該牢記這一原則。io