異常

error:由系統底層發生,修改代碼

exception:告訴jvm,jvm告訴使用者

    舉一個簡單的例子

    Int[] a=new Int[10];

    System.out.println("a[10]");

    輸出語句發生問題時,jvm就將這個已知的問題封裝成對象 throw new ArrayIndexOutOfBoundsException(1);將問題拋給調用者main函數,如果main函數沒有針對的處理方法,main函數就繼續拋給調用者jvm,jvm會終止程序,jvm就使用了默認的處理方法,將問題的名稱+信息+位置在控制檯上顯示出來,讓調用者看到

    e.printStackTrace();名字+信息+位置 jvm默認的處理,收到異常就是調用這個方法,將信息顯示到屏幕上。

異常的處理:

1.遇到問題不進行具體的處理,而是繼續拋給調用者,其實就是在函數上通過throws關鍵字聲明異常,告訴調用者。

2.針對性的處理方法,捕獲。

    try{

        有可能異常的代碼

    }catch(異常變量){

        捕獲,處理異常的代碼   

    }finally{

        一定會被執行的代碼

}

throw和throws有什麼區別?

1.位置不同

throws用在函數上,後面跟着的是異常類,可以跟多個

throw用在函數內,後面跟的是一場對象

2.功能不同

throws用來聲明異常,讓調用者只知道該功能可能出現的問題,並由調用者給出預先的處理方法

throw拋出具體的問題對象,執行到throw,功能就已經結束了,就跳轉到調用者,並將具體的問題對象也拋給調用者。也就是throw語句獨立存在時,下面不要定義其他語句,執行不到。

3.執行時期不同

throws編譯時期

throw運行時期

finally

finally塊用於回收再try塊裏打開的物理資源,異常機制會保證finally總被執行

當catch中遇到return時。finally還是會被執行

除非在try塊、catch塊中使用了system.exit(0);退出ivm,只有這種情況下finally不會執行

儘量避免在finally塊中使用return或throw等導致方法終止的語句,否則會出現一些很奇怪的現象

    當程序在try,catch中一到return或throw語句(該語句都會導致方法立即結束),系統執行這兩個語句並不會結束該方法,而是會去尋找該異常處理流程中是否包含finally塊。

如果沒有finally塊,程序立即執行return或throw語句,方法終止。

如果有finally塊,系統立即執行finally塊,只有當finally塊執行完成後,系統纔會調回來執行try,catch塊中的return或throw語句。如果finally有return或throw語句,finally已經終止了方法,系統不會再跳回去執行try,catch塊中的任何代碼

    爲了保證try語句可以自動關閉資源,這些資源實現類必須實現AutoCloseable或Closeable接口,實現這兩個接口就必須實現close()方法

    自動關閉資源的try語句相當於包含了隱式的finally塊(這個finally塊用於關閉資源),此時try語句中既沒有catch也沒有finally







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章