try

java關鍵字

Java關鍵字

用於try..catch..finally塊,進行異常捕獲。

基本信息


名稱: try
用法:try是try..catch..finally塊中用來引導第一部分的關鍵字,用於聲明需要捕獲指定語句塊的異常
完整的使用方法是
catch可以出現0次、1次或多次,finally可以出現0次或1次,但是catch和finally不能同時不出現。
catch用法:
當語句塊1中拋出異常時,立即離開語句塊1,之後會在所有catch中依次進行類名比對。如果拋出異常和catch聲明的異常類名一致,或拋出異常是catch聲明的異常的子類,則會進入該catch的語句塊(成為異常的捕獲),在catch的語句塊中可以將異常輸出到命令行或引導用戶進行問題反饋。如果任何一個catch都不匹配,會像上層調用拋出這一異常(在此之前會進入finally語句塊,詳情參考下面的finally用法)。
finally用法:
在語句塊1、語句塊2中,任何試圖離開try..catch..finally塊的語句都會導致語句塊3被執行,如return throw break continue。在finally的語句塊中可以進行內存回收等工作。
需要注意的是,如果導致離開的不是語句造成的,而是斷電、內存不足等計算機故障,finally語句塊不會被執行。
例子:

作用關係


try..catch..finally塊和return的作用關係不易於理解。
在這裡catch中的return語句和try中的return語句相似,因此只討論try..finally的情況
例1:
函數返回1,1次調用后a的值為1
這是因為在函數返回之前finally語句塊會被執行
例2:
函數返回2
這是因為在函數返回之前finally語句塊會被執行,因此return 2;會早於return 1;
Intellij IDEA等深度IDE中會提示unreachable statement
例3:
函數返回10,1次調用后a的值為1
jdk在進行編譯時,會這樣理解代碼:
1、將a + 10的值進行暫存,等待函數返回(該值為10)
2、執行a++(a的值變為1)
3、返回剛才暫存的值
相當於
例4:
c4函數返回2,1次調用后a的值為2
jdk在進行編譯時,會這樣理解代碼:
1、(在try中)調用change並將其結果的值進行暫存,等待函數返回(該值為1)(a的值變為1)
2、(在finally中)調用change並返回(該值為2)(a的值變為2)(之前暫存的值失效,JVM會自動進行內存回收)
相當於