大風吹去了往日的霧霾,陽光透過窗戶照進來,透過窗戶可以看到遠處的山脈與藍天相接,這可比我那永遠見不到陽光的出租屋好多了,漸漸走進的腳步聲打斷了我的思緒,一位小姐姐坐在了面前,甜甜的香水味立刻鉆進了我的鼻孔,
小姐姐微笑地說:”您好,我是今天的面試官,那么開始吧?“
我收起直勾勾的眼睛,說:“好的,”
小姐姐說:“在Java的例外處理中有兩大組成要素:拋出例外和捕獲例外,那么拋出例外可以分為哪兩種呢?”
我立刻回答到:
拋出例外可以分為顯式和隱式,顯式拋例外是在代碼中使用throw關鍵字手動將例外實體拋出,隱式拋例外是 Java 虛擬機在執行程序中,遇到無法繼續執行的例外狀態,自動將例外實體拋出,比如我們經常遇到的空指標例外(NullPointerException),
小姐姐說:“很好,那么捕獲例外中經常用到哪些關鍵字呢?”
我立刻回答到:
我們一般用到try、catch、finally等關鍵字,try被用來標記需要進行例外監控的代碼;catch被用來捕獲在try 監控的代碼中觸發的某種指定型別的例外,還可以定義針對該例外型別進行如何處理;finally被用來宣告一段無論發生什么例外都必定運行的代碼,它避免跳過某些關鍵的清理代碼,比如:關閉已打開的IO資源,
小姐姐說:“很好,如果三個關鍵字一起使用,代碼執行的順序是什么樣子的?”
我立刻回答到:
在正常執行的情況下,先執行try中的代碼再執行finally中的代碼,
如果try中的代碼觸發例外,并且例外沒有被捕獲,finally中代碼會被直接執行,并且在執行之后重新拋出該例外;如果例外被catch捕獲,先執行catch中的代碼再執行finally中的代碼,
如果catch中的代碼也觸發了例外,那么finally中代碼同樣會被執行,并會拋出catch代碼觸發的那個例外,如果finally中的代碼也觸發了例外,那么會中斷當前finally 代碼的執行,并拋出例外,
小姐姐說:“很好,在Java虛擬機中,是通過什么方式實作例外處理?”
這個問題有點難度,我稍微思考了一下回答到:
主要是通過例外表,在編譯生成的位元組碼中,每個方法都附帶一個例外表,例外表中可能有多條記錄,每一條記錄都包括from指標、to 指標、target指標和所捕獲的例外型別,這些指標的值是位元組碼索引(bytecode index),用于定位位元組碼,
其中,from指標和to指標表示例外處理監控的范圍,比如: try所覆寫的范圍,target指標指向例外處理代碼的起始位置,比如:catch代碼的起始位置,
如果有例外觸發時,Java虛擬機會從上至下遍歷例外表中的所有記錄,當觸發例外的位元組碼的索引值在某個例外表記錄的監控范圍內,Java虛擬機會判斷所拋出的例外和該記錄想要捕獲的例外是否匹配,如果匹配,控制流轉將會移至該記錄 target 指標指向的位元組碼,
小姐姐說:“有點抽象,可以舉個例子嗎?”
“當然可以,”我一邊說,一邊在紙上寫了起來:
public class OneMore {
public static void main(String[] args) {
String str = "萬貓學社";
try {
str = "try";
} catch (Exception e) {
str = "catch";
}
}
}
這段代碼的 main 方法中,我定義了一段try 和catch 代碼,編譯過后的位元組碼中,這個方法的例外表擁有一個記錄:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: ldc #2 // String 萬貓學社
2: astore_1
3: ldc #3 // String try
5: astore_1
6: goto 13
9: astore_2
10: ldc #5 // String catch
12: astore_1
13: return
Exception table:
from to target type
3 6 9 Class java/lang/Exception
其from指標和to指標分別為 3 和 6,代表它的監控范圍從索引為 3 的位元組碼開始,到索引為 6 的位元組碼結束(不包括 6),該記錄的 target 指標是 9,代表這個例外處理從索引為 9 的位元組碼開始,該記錄的最后一列,代表該例外處理所捕獲的例外型別是Exception,
當觸發例外的位元組碼的索引值在 3 和 6 之間時,Java虛擬機會判斷所拋出的例外是否時Exception,如果是,控制流轉將會移至索引為 9 的位元組碼開始執行,
小姐姐滿意地說:“很好,我去叫HR和你聊聊,如果順利的話,今天就可以發offer,”
參考文獻:
《Java編程思想》
《Java核心技術》
《深入理解Java虛擬機:JVM高級特性與實踐》
竟然已經看到這里了,你我定是有緣人,留下你的點贊和關注,他日必成大器,
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍
作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
著作權宣告:本文遵循 CC 4.0 BY-NC-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
微信掃描二維碼,關注萬貓學社,回復「電子書」,免費獲取12本Java必讀技術書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440348.html
標籤:Java
上一篇:Spring的介面集合注入功能
