欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java面向對象基礎(封裝繼承多態(tài))【4】 異常處理

在實(shí)際工作中,我們遇到的情況不可能是非常完美的。比如:你寫(xiě)的某個(gè)模塊,用戶(hù)輸入不一定符合你的要求;你的程序要打開(kāi)某個(gè)文件,這個(gè)文件可能不存在或者文件格式不對;你要讀取數據庫的數據,數據可能是空的;我們的程序再運行著(zhù),但是內存或硬盤(pán)可能滿(mǎn)了等等。

      軟件程序在運行過(guò)程中,非??赡苡龅絼倓偺岬降倪@些問(wèn)題,我們稱(chēng)之為異常,英文是:Exception,意思是例外。遇到這些例外情況,或者叫異常,我們怎么讓寫(xiě)的程序做出合理的處理,安全的退出,而不至于程序崩潰呢?

異常(Exception)的概念

  異常指程序運行過(guò)程中出現的非正?,F象,例如用戶(hù)輸入錯誤、除數為零、需要處理的文件不存在、數組下標越界等。

      在Java的異常處理機制中,引進(jìn)了很多用來(lái)描述和處理異常的類(lèi),稱(chēng)為異常類(lèi)。異常類(lèi)定義中包含了該類(lèi)異常的信息和對異常進(jìn)行處理的方法。

      所謂異常處理,就是指程序在出現問(wèn)題時(shí)依然可以正確的執行完。

Java是采用面向對象的方式來(lái)處理異常的。處理過(guò)程:

      1. 拋出異常:在執行一個(gè)方法時(shí),如果發(fā)生異常,則這個(gè)方法生成代表該異常的一個(gè)對象,停止當前執行路徑,并把異常對象提交給JRE。

      2.  捕獲異常:JRE得到該異常后,尋找相應的代碼來(lái)處理該異常。JRE在方法的調用棧中查找,從生成異常的方法開(kāi)始回溯,直到找到相應的異常處理代碼為止。

異常分類(lèi)

JDK 中定義了很多異常類(lèi),這些類(lèi)對應了各種各樣可能出現的異常事件,所有異常對象都是派生于Throwable類(lèi)的一個(gè)實(shí)例。如果內置的異常類(lèi)不能夠滿(mǎn)足需要,還可以創(chuàng )建自己的異常類(lèi)。

      Java對異常進(jìn)行了分類(lèi),不同類(lèi)型的異常分別用不同的Java類(lèi)表示,所有異常的根類(lèi)為java.lang.Throwable,Throwable下面又派生了兩個(gè)子類(lèi):Error和Exception。

Error

Error是程序無(wú)法處理的錯誤,表示運行應用程序中較嚴重問(wèn)題。大多數錯誤與代碼編寫(xiě)者執行的操作無(wú)關(guān),而表示代碼運行時(shí) JVM(Java 虛擬機)出現的問(wèn)題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時(shí),將出現 OutOfMemoryError。這些異常發(fā)生時(shí),Java虛擬機(JVM)一般會(huì )選擇線(xiàn)程終止。

      Error表明系統JVM已經(jīng)處于不可恢復的崩潰狀態(tài)中。我們不需要管它。

Exception

  Exception是程序本身能夠處理的異常,如:空指針異常(NullPointerException)、數組下標越界異常(ArrayIndexOutOfBoundsException)、類(lèi)型轉換異常(ClassCastException)、算術(shù)異常(ArithmeticException)等。

      Exception類(lèi)是所有異常類(lèi)的父類(lèi),其子類(lèi)對應了各種各樣可能出現的異常事件。通常Java的異??煞譃椋?/span>

      1. RuntimeException 運行時(shí)異常

      2. CheckedException 已檢查異常

RuntimeException運行時(shí)異常

派生于RuntimeException的異常,如被 0 除、數組下標越界、空指針等,其產(chǎn)生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會(huì )對程序可讀性和運行效率影響很大。因此由系統自動(dòng)檢測并將它們交給缺省的異常處理程序(用戶(hù)可不必對其處理)。

      這類(lèi)異常通常是由編程錯誤導致的,所以在編寫(xiě)程序時(shí),并不要求必須使用異常處理機制來(lái)處理這類(lèi)異常,經(jīng)常需要通過(guò)增加“邏輯處理來(lái)避免這些異?!?。

ArithmeticException異常:試圖除以0

解決如上異常需要修改代碼:

當程序訪(fǎng)問(wèn)一個(gè)空對象的成員變量或方法,或者訪(fǎng)問(wèn)一個(gè)空數組的成員時(shí)會(huì )發(fā)生空指針異常(NullPointerException)。怎么處理?

NullPointerException異常

解決空指針異常,通常是增加非空判斷:

解決空指針異常,通常是增加非空判斷:

  在引用數據類(lèi)型轉換時(shí),有可能發(fā)生類(lèi)型轉換異常(ClassCastException)

ClassCastException異常

當程序訪(fǎng)問(wèn)一個(gè)數組的某個(gè)元素時(shí),如果這個(gè)元素的索引超出了0~數組長(cháng)度-1這個(gè)范圍,則會(huì )出現數組下標越界異常(ArrayIndexOutOfBoundsException)。

ArrayIndexOutOfBoundsException異常

  解決數組索引越界異常的方式,增加關(guān)于邊界的判斷:

在使用包裝類(lèi)將字符串轉換成基本數據類(lèi)型時(shí),如果字符串的格式不正確,則會(huì )出現數字格式異常(NumberFormatException)。

NumberFormatException異常

數字格式化異常的解決,可以引入正則表達式判斷是否為數字:

注意事項

      1. 在方法拋出異常之后,運行時(shí)系統將轉為尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發(fā)生時(shí)依次存留在調用棧中的方法的集合。當異常處理器所能處理的異常類(lèi)型與方法拋出的異常類(lèi)型相符時(shí),即為合適的異常處理器。

      2. 運行時(shí)系統從發(fā)生異常的方法開(kāi)始,依次回查調用棧中的方法,直至找到含有合適異常處理器的方法并執行。當運行時(shí)系統遍歷調用棧而未找到合適的異常處理器,則運行時(shí)系統終止。同時(shí),意味著(zhù)Java程序的終止。

CheckedException已檢查異常

所有不是RuntimeException的異常,統稱(chēng)為Checked Exception,又被稱(chēng)為“已檢查異?!?,如IOException、SQLException等以及用戶(hù)自定義的Exception異常。這類(lèi)異常在編譯時(shí)就必須做出處理,否則無(wú)法通過(guò)編譯

異常的處理方式有兩種:使用“try/catch”捕獲異常、使用“throws”聲明異常。

異常的處理方式之一:捕獲異常

獲異常是通過(guò)3個(gè)關(guān)鍵詞來(lái)實(shí)現的:try-catch-finally。用try來(lái)執行一段程序,如果出現異常,系統拋出一個(gè)異常,可以通過(guò)它的類(lèi)型來(lái)捕捉(catch)并處理它,最后一步是通過(guò)finally語(yǔ)句為異常處理提供一個(gè)統一的出口,finally所指定的代碼都要被執行(catch語(yǔ)句可有多條;finally語(yǔ)句最多只能有一條,根據自己的需要可有可無(wú))

上面過(guò)程詳細解析:

1. try:

      try語(yǔ)句指定了一段代碼,該段代碼就是異常捕獲并處理的范圍。在執行過(guò)程中,當任意一條語(yǔ)句產(chǎn)生異常時(shí),就會(huì )跳過(guò)該條語(yǔ)句中后面的代碼。代碼中可能會(huì )產(chǎn)生并拋出一種或幾種類(lèi)型的異常對象,它后面的catch語(yǔ)句要分別對這些異常做相應的處理。

      一個(gè)try語(yǔ)句必須帶有至少一個(gè)catch語(yǔ)句塊或一個(gè)finally語(yǔ)句塊 。

注意事項

      當異常處理的代碼執行結束以后,不會(huì )回到try語(yǔ)句去執行尚未執行的代碼。

2. catch:

      n-每個(gè)try語(yǔ)句塊可以伴隨一個(gè)或多個(gè)catch語(yǔ)句,用于處理可能產(chǎn)生的不同類(lèi)型的異常對象。

      n-常用方法,這些方法均繼承自Throwable類(lèi) 。

          u-toString ()方法,顯示異常的類(lèi)名和產(chǎn)生異常的原因

          u-getMessage()方法,只顯示產(chǎn)生異常的原因,但不顯示類(lèi)名。

          u-printStackTrace()方法,用來(lái)跟蹤異常事件發(fā)生時(shí)堆棧的內容。

      n-catch捕獲異常時(shí)的捕獲順序:

          u-如果異常類(lèi)之間有繼承關(guān)系,在順序安排上需注意。越是頂層的類(lèi),越放在下面,再不然就直接把多余的catch省略掉。也就是先捕獲子類(lèi)異常再捕獲父類(lèi)異常。

2. finally:

      n-有些語(yǔ)句,不管是否發(fā)生了異常,都必須要執行,那么就可以把這樣的語(yǔ)句放到finally語(yǔ)句塊中。

      n-通常在finally中關(guān)閉程序塊已打開(kāi)的資源,比如:關(guān)閉文件流、釋放數據庫連接等。

try-catch-finally語(yǔ)句塊的執行過(guò)程:

      try-catch-finally程序塊的執行流程以及執行結果比較復雜。

      基本執行過(guò)程如下:

      程序首先執行可能發(fā)生異常的try語(yǔ)句塊。如果try語(yǔ)句沒(méi)有出現異常則執行完后跳至finally語(yǔ)句塊執行;如果try語(yǔ)句出現異常,則中斷執行并根據發(fā)生的異常類(lèi)型跳至相應的catch語(yǔ)句塊執行處理。catch語(yǔ)句塊可以有多個(gè),分別捕獲不同類(lèi)型的異常。catch語(yǔ)句塊執行完后程序會(huì )繼續執行finally語(yǔ)句塊。finally語(yǔ)句是可選的,如果有的話(huà),則不管是否發(fā)生異常,finally語(yǔ)句都會(huì )被執行。

注意事項

    1. 即使try和catch塊中存在return語(yǔ)句,finally語(yǔ)句也會(huì )執行。是在執行完finally語(yǔ)句后再通過(guò)return退出。

    2. finally語(yǔ)句塊只有一種情況是不會(huì )執行的,那就是在執行finally之前遇到了System.exit(0)結束程序運行。

異常的處理方式之二:聲明異常(throws子句)

當CheckedException產(chǎn)生時(shí),不一定立刻處理它,可以再把異常throws出去。

      在方法中使用try-catch-finally是由這個(gè)方法來(lái)處理異常。但是在一些情況下,當前方法并不需要處理發(fā)生的異常,而是向上傳遞給調用它的方法處理。

      如果一個(gè)方法中可能產(chǎn)生某種異常,但是并不能確定如何處理這種異常,則應根據異常規范在方法的首部聲明該方法可能拋出的異常。

      如果一個(gè)方法拋出多個(gè)已檢查異常,就必須在方法的首部列出所有的異常,之間以逗號隔開(kāi)

注意事項

      1. 方法重寫(xiě)中聲明異常原則:子類(lèi)重寫(xiě)父類(lèi)方法時(shí),如果父類(lèi)方法有聲明異常,那么子類(lèi)聲明的異常范圍不能超過(guò)父類(lèi)聲明的范圍。

自定義異常

  1.在程序中,可能會(huì )遇到JDK提供的任何標準異常類(lèi)都無(wú)法充分描述清楚我們想要表達的問(wèn)題,這種情況下可以創(chuàng )建自己的異常類(lèi),即自定義異常類(lèi)。

      2.自定義異常類(lèi)只需從Exception類(lèi)或者它的子類(lèi)派生一個(gè)子類(lèi)即可。

      3.自定義異常類(lèi)如果繼承Exception類(lèi),則為受檢查異常,必須對其進(jìn)行處理;如果不想處理,可以讓自定義異常類(lèi)繼承運行時(shí)異常RuntimeException類(lèi)。

      4.習慣上,自定義異常類(lèi)應該包含2個(gè)構造器:一個(gè)是默認的構造器,另一個(gè)是帶有詳細信息的構造器。

使用異常機制的建議

      1.要避免使用異常處理代替錯誤處理,這樣會(huì )降低程序的清晰性,并且效率低下。

      2.處理異常不可以代替簡(jiǎn)單測試---只在異常情況下使用異常機制。

      3.不要進(jìn)行小粒度的異常處理---應該將整個(gè)任務(wù)包裝在一個(gè)try語(yǔ)句塊中。

      4.異常往往在高層處理(先了解!后面做項目會(huì )說(shuō)!) 。

如何利用百度解決異常問(wèn)題

正常學(xué)習和開(kāi)發(fā)中,我們經(jīng)常會(huì )遇到各種異常。大家在遇到異常時(shí),需要遵循下面四步來(lái)解決:

      1. 細心查看異常信息,確定異常種類(lèi)和相關(guān)Java代碼行號;

      2. 拷貝異常信息到百度,查看相關(guān)帖子,尋找解決思路;

      3. 前兩步無(wú)法搞定,再問(wèn)同學(xué)或同事;

      4. 前三步無(wú)法搞定,請示領(lǐng)導。

      很多同學(xué)碰到異常一下就慌了,立刻開(kāi)始請教別人搬救兵,殊不知這樣做有兩大壞處。第一、太不尊重別人,把別人當苦力。第二、失去提高自我的機會(huì ),自己解決一個(gè)異常,就意味著(zhù)有能力解決一類(lèi)異常。解決一類(lèi)異常能大大提高自身能力。

總結

1. Error與Exception都繼承自Throwable類(lèi)

2. Error類(lèi)層次描述了Java運行時(shí)系統內部錯誤和資源耗盡錯誤。

3. Exception類(lèi)是所有異常類(lèi)的父類(lèi),其子類(lèi)對應了各種各樣可能出現的異常事件。

4. 常見(jiàn)的異常類(lèi)型

      --ArithmeticException

      --NullPointerException

      --ClassCastException

      --ArrayIndexOutOfBoundsException

      --NumberFormatException

5. 方法重寫(xiě)中聲明異常原則:子類(lèi)聲明的異常范圍不能超過(guò)父類(lèi)聲明的范圍

6. 異常處理的三種方式

      --捕獲異常:try-catch-finally

      --聲明異常:throws

7. 自定義異常類(lèi)只需從Exception類(lèi)或者它的子類(lèi)派生一個(gè)子類(lèi)即可。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
詳解Java中異常處理機制
java異常理解(2)
深入學(xué)習java異常機制
好程序員Java教程系列之異常定義
Java異常
java中的異常和其體系結構
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久