全面理解java异常机制
??????在理想狀態(tài)下,程序會按照我們預(yù)想的步驟一步一步的執(zhí)行,但是即使你是大牛,你也不可避免出錯,所以java為我們提供了異常機制。本文將會從以下幾個方面介紹java中的異常機制:
異常機制的層次結(jié)構(gòu)
異常的處理過程
拋出異常
捕獲異常
異常機制的實現(xiàn)細節(jié)
一、異常機制的層次結(jié)構(gòu)
??????在java程序設(shè)計語言中,所有的異常對象都是派生于Throwable類,一般情況下,如果java中內(nèi)置的異常類不能滿足需求,可以自定義異常類只需要繼承與Throwable類即可,下面是java 中的異常層次結(jié)構(gòu):
??????error類表示java內(nèi)部錯誤,例如jvm出錯或者內(nèi)存不足等,這層一般不用我們關(guān)心(其實我們也無可奈何,如果出現(xiàn)此種問題),一旦出現(xiàn)此種錯誤程序會自動結(jié)束。
??????我們主要還是需要研究Exception類及其子類,Exception主要有兩個子類,IOException和RuntimeException我們一個個看。IOException是IO錯誤類問題導(dǎo)致的異常,是可預(yù)知的,例如由于文件不存在而打開文件失敗引起的異常等。RuntimeException類異常表示運行時異常,例如數(shù)組下標越界,訪問空指針等,是不可預(yù)知的,但是這類異常于編寫程序時應(yīng)當(dāng)予以避免,例如你可以使用if(a==null).....,加以檢查避免。
??????以上從一種角度對這些主要的異常類進行了分類,其實我們還有一種分類方式,按照是否是檢查類異常(checked)進行分類,什么是檢查類異常?檢查類異常(checked)就是指編譯器會檢查當(dāng)前的代碼塊中,判斷是否有這么一條語句在程序執(zhí)行時可能產(chǎn)生異常,如果有就會建議程序員處理。(實際上你必須處理,不然編譯不會通過),在以上的分層中,error類和RuntimeException類屬于非檢查異常類(unchecked),而IOException屬于檢查類異常。
二、異常的處理過程
??????相信大家在看完上文之后,可以判斷出此處的異常應(yīng)該屬于RuntimeException,屬于unchecked異常,由輸出的結(jié)果可以看出:main方法中調(diào)用方法doMaths();,于是進入該方法內(nèi)部,執(zhí)行int a = 10/0;產(chǎn)生異常,在本方法中未找到處理,于是返回調(diào)用處(即main函數(shù)中),發(fā)現(xiàn)main函數(shù)中依然沒有處理方法,于是執(zhí)行默認操作(打印異常信息)。
??????我們的程序難免會出現(xiàn)問題,但是絕對不能讓用戶看出來你的程序出現(xiàn)問題,所以這些異常信息是絕對不能讓用戶看見的,且不說他是否能看懂,一旦遇到“行家”,你的程序就會存在安全隱患,由此可見,對異常的處理是多么重要。下面我們將討論兩種處理異常的機制。
三、拋出異常
??????以下所討論的處理異常的方法,主要還是針對檢查類異常(checked),因為對于error類的錯誤我們沒法處理,對于RuntimeException類異常我們應(yīng)當(dāng)盡量在程序中加以避免,所以我們主要還是對檢查類異常進行處理。
??????我們使用關(guān)鍵字throws將本程序中可能遇到的異常向上拋出(向調(diào)用出拋出,讓調(diào)用者處理),而本身不做處理。
??????throws 緊跟方法的括號后面,這個叫異常的聲明表示本方法不處理這個異常,誰調(diào)用我這個方法誰來處理(后面將討論如何處理異常,因為總要有人來處理,否則就默認打印異常信息),可以聲明多個異常,異常之間使用逗號相隔。
??????那么throw關(guān)鍵字和throws關(guān)鍵字究竟有什么聯(lián)系呢?throw可以理解為是在throws關(guān)鍵字的主動行為。先看代碼:
??????小結(jié)一下,throws關(guān)鍵字表示:本函數(shù)中存在某個異常但是我不知道,如果出現(xiàn)此異常就拋給調(diào)用者。throw一般和判斷語句if配合的多表示:如果滿足條件就結(jié)束此函數(shù)并向調(diào)用者拋出異常,否則就繼續(xù)執(zhí)行接下來的代碼。
四、捕獲異常
??????以上說了那么多,我們知道如何將遇到的異常拋出,讓別人處理,但是總是有人需要處理這個異常的,總不能讓系統(tǒng)默認的將異常信息打印出來吧!再者說,一個strong的程序必須要有對錯誤的處理,讓程序控制在手中而不是莫名卡死或者退出。接下來,我們一起探討如何捕獲異常對他進行處理。
??????捕獲異常,我們使用try{}catch{}關(guān)鍵字,try中代碼表示可能出現(xiàn)異常的代碼塊,catch中的代碼塊表示捕捉到該異常之后需要進行的后續(xù)操作。
??????對比于之前,打印自己控制的內(nèi)容是不是比默認打印異常信息更加的友好?我們常常會遇到這么一個問題:打開一個文件,準備對文件進行操作,但是在對文件的操作過程中出現(xiàn)異常,退出程序了,但是文件并沒有被顯式的關(guān)閉,造成資源浪費。
??????我們常常使用關(guān)鍵字finally來完成類似這樣的操作。finally關(guān)鍵字緊跟catch后面,表示無論是否發(fā)生異常都會執(zhí)行的代碼塊。finally不是必須的可以沒有。
五、異常機制的實現(xiàn)細節(jié)
??????第一個我想說的是try{}catch{}這種結(jié)構(gòu)并不是唯一的,可以由多個catch語句的,對多個不同的異常進行捕獲。
??????第二個很重要的finally這個關(guān)鍵字中如果出現(xiàn)return等關(guān)鍵字程序的接下來的執(zhí)行順序問題。例如:
??????能想明白么?其實不難,只要知道finally語句塊中是最后執(zhí)行的就可以理解了,當(dāng)try中出現(xiàn)異常,被catch接住,將a賦值為1,在返回之前跳轉(zhuǎn)到finally語句塊中,最后在finally語句塊中返回2,這種在finally語句塊中有return語句的會阻止catch中的return執(zhí)行。
??????所以,我們建議finally語句塊中不要使用return語句。
??????以上便是java異常機制的基本內(nèi)容,如果錯誤,望大家指出。tk
轉(zhuǎn)載于:https://blog.51cto.com/12883930/1923309
總結(jié)
以上是生活随笔為你收集整理的全面理解java异常机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用经典SQL语句大全完整版--详解+实
- 下一篇: SharePoint 2013 搭建负载