首先,try/catch怎麼寫呢?如下圖所示:
那麼try catch到底在JVM底層是如何實現的呢?
首先明確一個概念,在Java中如果不發生異常的話,try/catch其實不會造成任何性能損失。這是如何做到的呢
- 首先,在Java文件編譯成爲字節碼之後,其實正常流程與異常處理部分是分開來的,如下圖所示:
每個有異常處理的方法其實在class文件中都是一個異常表,這個表中的內容與每個try/catch塊相對應,每一行由四個內容組成:開始位置、結束位置、異常處理的偏移位、一個異常緩衝池,如下圖所示:
- 2.當代碼在運行時拋出了異常時,首先拿着拋出位置到異常表中查找是否可以被catch(例如看位置是不是處於任何一欄中的開始和結束位置之間),如果可以則跑到異常處理的起始位置開始處理,如果沒有找到則原地return,並且copy異常的引用給父調用方,接着看父調用的異常表,以此類推。