Java- 異常處理
- 異常處理能夠使一個(gè)方法給它的調(diào)用者拋出一個(gè)異常。
- Java異常是派生自
java.lang.Throwable的類的實(shí)例。Java 提供大量預(yù)定義的異常類,例如,Error、Exception、RuntimeException、ClassNotFoundException、NullPointerException和ArithmeticException。也可以通過(guò)擴(kuò)展Exceotion類來(lái)定義自己的異常類。 - 異常發(fā)生在一個(gè)方法的執(zhí)行過(guò)程中。
RuntimeException和Error都是免檢異常,其他所有的異常都是必檢的。 - 當(dāng)聲明一個(gè)方法時(shí),如果這個(gè)方法可能拋出一個(gè)必檢異常,則必須聲明為必檢異常,告訴編譯器可能會(huì)出現(xiàn)什么異常。
- 聲明異常的關(guān)鍵字是
throws,而拋出異常的關(guān)鍵字throw。 - 如果調(diào)用聲明了必檢異常的方法,必須將該方法調(diào)用放在
try語(yǔ)句中。在方法執(zhí)行過(guò)程中出現(xiàn)異常時(shí),catch塊會(huì)捕獲并處理異常。 - 如果一個(gè)異常沒有被當(dāng)前方法捕獲,則該異常被傳給調(diào)用者。這個(gè)過(guò)程不斷重復(fù)直到異常被捕獲或者傳遞給 main 方法。
- 可以從一個(gè)通用的父類派生出各種不同的異常類。如果一個(gè)
catch塊捕獲到父類的異常對(duì)象,它也能捕獲這個(gè)父類的子類的所有異常對(duì)象。 - 在
catch塊中,異常被指定順序是非常重要的。如果在一個(gè)類的父類的異常對(duì)象之前沒有指定這個(gè)類的一個(gè)異常對(duì)象,就會(huì)導(dǎo)致一個(gè)編譯錯(cuò)誤。 - 當(dāng)方法中發(fā)生異常時(shí),如果異常沒有被捕獲,方法將會(huì)立刻退出。如果方法想在退出前執(zhí)行一些任務(wù),可以在方法中捕獲這個(gè)異常,然后再重新拋給真正的處理器。
- 任何情況下都會(huì)執(zhí)行
finally塊中的代碼,不管 try 塊中是否出現(xiàn)或者捕獲了異常。 - 異常處理將錯(cuò)誤處理代碼從正常的程序設(shè)計(jì)任務(wù)中分離出來(lái),這樣,就會(huì)使得程序更易于閱讀和修改。
- 不應(yīng)該使用異常處理代替簡(jiǎn)單的測(cè)試。應(yīng)該盡可能地測(cè)試簡(jiǎn)單異常,將異常處理保留為處理那些無(wú)法用 if 語(yǔ)句處理的異常。
必檢異常是指:編譯器會(huì)強(qiáng)制程序員檢查并處理它們。
免檢異常:在大多數(shù)情況下,免檢異常都會(huì)反映出程序設(shè)計(jì)上不可恢復(fù)的邏輯錯(cuò)誤。例如:如果通過(guò)一個(gè)引用變量訪問(wèn)一個(gè)對(duì)象之前并未將一個(gè)對(duì)象賦值給它,就會(huì)拋出 NullPointerException 異常;如果訪問(wèn)一個(gè)數(shù)組的越界元素,就會(huì)拋出 IndexOutOfBoundsException 異常。這些都是程序中必須糾正的邏輯錯(cuò)誤。免檢異??赡茉诔绦虻娜魏我粋€(gè)地方出現(xiàn)。為了避免過(guò)多的使用 try-catch 塊,Java 語(yǔ)言不允許編寫代碼捕獲或聲明免檢異常。