Java- 異常處理
- 異常處理能夠使一個(gè)方法給它的調(diào)用者拋出一個(gè)異常惰瓜。
- Java異常是派生自
java.lang.Throwable
的類的實(shí)例唉堪。Java 提供大量預(yù)定義的異常類屈呕,例如,Error
、Exception
歪脏、RuntimeException
良蒸、ClassNotFoundException
技扼、NullPointerException
和ArithmeticException
。也可以通過擴(kuò)展Exceotion
類來定義自己的異常類嫩痰。 - 異常發(fā)生在一個(gè)方法的執(zhí)行過程中剿吻。
RuntimeException
和Error
都是免檢異常,其他所有的異常都是必檢的串纺。 - 當(dāng)聲明一個(gè)方法時(shí)丽旅,如果這個(gè)方法可能拋出一個(gè)必檢異常椰棘,則必須聲明為必檢異常,告訴編譯器可能會(huì)出現(xiàn)什么異常榄笙。
- 聲明異常的關(guān)鍵字是
throws
邪狞,而拋出異常的關(guān)鍵字throw
。 - 如果調(diào)用聲明了必檢異常的方法茅撞,必須將該方法調(diào)用放在
try
語句中帆卓。在方法執(zhí)行過程中出現(xiàn)異常時(shí),catch
塊會(huì)捕獲并處理異常乡翅。 - 如果一個(gè)異常沒有被當(dāng)前方法捕獲鳞疲,則該異常被傳給調(diào)用者。這個(gè)過程不斷重復(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ù)中分離出來故源,這樣,就會(huì)使得程序更易于閱讀和修改汞贸。
- 不應(yīng)該使用異常處理代替簡單的測試绳军。應(yīng)該盡可能地測試簡單異常,將異常處理保留為處理那些無法用 if 語句處理的異常矢腻。
必檢異常
是指:編譯器會(huì)強(qiáng)制程序員檢查并處理它們门驾。
免檢異常
:在大多數(shù)情況下,免檢異常都會(huì)反映出程序設(shè)計(jì)上不可恢復(fù)的邏輯錯(cuò)誤踏堡。例如:如果通過一個(gè)引用變量訪問一個(gè)對(duì)象之前并未將一個(gè)對(duì)象賦值給它猎唁,就會(huì)拋出 NullPointerException
異常;如果訪問一個(gè)數(shù)組的越界元素顷蟆,就會(huì)拋出 IndexOutOfBoundsException
異常诫隅。這些都是程序中必須糾正的邏輯錯(cuò)誤。免檢異痴寿耍可能在程序的任何一個(gè)地方出現(xiàn)逐纬。為了避免過多的使用 try-catch 塊,Java 語言不允許編寫代碼捕獲或聲明免檢異常削樊。