天天看點

Java異常及異常塊執行次序(try、catch、finally、return)

java異常:

①使用try-catch-finally處理異常;

②使用throw、throws抛出異常;

③上邊為java異常處理5個關鍵字。

異常是程式在設計時或運作時産生的錯誤,異常處理是處理異常的過程,一旦異常被處理後,異常就不存在了,是以程式就可以繼續運作了。如果異常不被處理,程式就會被強制終止(終止出現異常的業務代碼執行)。

在程式運作中,程式的try、catch、finally、return執行次序,就要進行考慮了。

①:捕獲異常

三種情況:

1:try代碼塊中無異常,try代碼執行完成,則不進入不執行catch(跳過),執行finally塊,及異常塊後的其他代碼other code;

2:try代碼塊中發生異常,try代碼執行到有異常處即之後中斷,産生異常對象(跟蹤堆棧,執行流程),進入catch塊(異常類型比對後處理),後執行finally塊,及異常塊後的其他代碼other code;

3:try代碼塊中發生異常,産生異常對象,異常類型不比對,或者不捕獲,程式中斷運作(不用try和catch塊進行處理,代碼在異常出停止);

注:finally塊語句唯一不執行的情況:異常處理代碼catch中執行system.exit(1)退出java虛拟機 ;

      一段代碼可能會發生多種類型的異常,當發生異常,會按順序檢視每個catch語句,并執行第一個與異常類型比對的catch塊,執行後,其他的catch語句将忽略,執行繼續執行finally塊,及異常塊後的其他代碼other code。

②:throws聲明異常,throw抛出異常

注:代碼抛出異常後,要在方法上聲明可能發生的異常

看段代碼,會執行出什麼結果:

其實上邊代碼是不能被編譯通過的:

錯誤1:

Java異常及異常塊執行次序(try、catch、finally、return)

在return result;這一行;

error:(remove) unreachable code(不能執行到的代碼,因為finally在return前執行,return -1;所有代碼已經結束,代碼return result;則不會被執行)

警告1:

Java異常及異常塊執行次序(try、catch、finally、return)

警告在finally塊上:

finally塊{ }中的代碼:warning:finally block does not complete normally(finally塊不能正常完成,finally沒有執行完畢就return了)

警告2:在注釋掉,有錯誤的return result;行後.

Java異常及異常塊執行次序(try、catch、finally、return)

警告在方法第一層局部變量:int result = 0;上:

局部變量result:warning:(result)the value of the local variable result is not used(局部變量的值未被使用,在同級範圍未被使用,可以在使用出定義更内部局部變量替代.)

錯誤代碼//  return result;,注釋掉後,代碼:

Java異常及異常塊執行次序(try、catch、finally、return)

執行結果為:

我是必須執行的finally!

傳回結果:-1

java.lang.arithmeticexception: / by zero

at com.test.trycatchfinally.testreturnfinallysort(trycatchfinally.java:12)

at com.test.trycatchfinally.main(trycatchfinally.java:7)

我是異常處理日志:除數為空異常!/ by zero

第二個- 1 ,因為,發生除數為0的算數異常(arithmeticexception),在catch中做了,空處理(隻列印列印異常資訊日志),所有不做業務異常處理,之後執行finally,是以為-1(兩次都是它傳回的.)

通過下邊代碼,現在來看看,try、catch、finally、return執行次序:

執行結果:

1 execute the code before

3 abnormal block execution:/ by zero

4 has been performed

注:5 傳回方法最終執行結果,此處異常處理,隻為列印日志,傳回result初始值0.

main output result:0

可以看出:

代碼順序為:執行try中要執行的代碼,碰到異常,執行try中代碼立即停止,進入catch中處理,處理完成後,進入finally中,最後return代碼結束(整個代碼正常執行);

下邊代碼為正常執行(不會進catch):

輸出為:

2 execute the code after

main output result:5

下邊為有異常,但不做異常處理代碼:

控制台,輸出為:

exception in thread "main" java.lang.arithmeticexception: / by zero

at com.tsxs.exception.trycatchforcatchfinally.divide1(trycatchforcatchfinally.java:10)

at com.tsxs.exception.trycatchforcatchfinally.main(trycatchforcatchfinally.java:4)

注:異常不被catch處理,則異常發生,程式中斷運作,之後其他的代碼5步和return都将不會被執行。

java異常結構:

Java異常及異常塊執行次序(try、catch、finally、return)

throwable為exception和error類的父類

error為僅靠程式本身無法恢複的嚴重錯誤

exception為由java應用程式抛出和處理的非嚴重錯誤

runtimeexception運作時異常可以不處理,在程式設計時應該多考慮,盡量的避免發生

runtimeexception之外的其他異常,設計時異常必須處理,還包括自定義業務異常

注:

異常對性能不利。抛出異常首先要建立一個新的對象。throwable接口的構造函數調用名為fillinstacktrace()的本地(native)方法,fillinstacktrace()方法檢查堆棧,收集調用跟蹤資訊。隻要有異常被抛出,jvm就必須調整調用堆棧,因為在處理過程中建立了一個新的對象。 異常隻能用于錯誤處理,不應該(建議)用來控制程式流程。

注:錯誤業務糾正,如果您是做業務需求的話,進入catch之後,如果不寫入錯誤業務處理代碼(代碼效率低),隻列印日志,則應該return停止業務,不然的話,catch塊後的代碼将會一直執行,導緻業務出現錯誤!看以下代碼:

執行結果:

8+0的和為:8

 at com.test.trycatchfinally.testcodecontinue(trycatchfinally.java:16)

 at com.test.trycatchfinally.main(trycatchfinally.java:5)

我是異常塊後的繼續代碼……

8*0的積為:0

如果出現錯誤被return,則:

執行結果為:

 at com.test.trycatchfinally.testcodecontinue(trycatchfinally.java:53)

 at com.test.trycatchfinally.main(trycatchfinally.java:7)

這兒也可以看出,finally在return之前執行.此代碼,因為return而終止執行!