
Throwable類(lèi)是Java中所有錯(cuò)誤Error和異常Exception的超類(lèi)
-
Java中的異常被分為兩大類(lèi):編譯時(shí)異常和運(yùn)行時(shí)異常,也被稱為受檢異常和非受檢異常;所有的RuntimeException類(lèi)及其子類(lèi)被稱為運(yùn)行時(shí)異常,其他的異常都是編譯時(shí)異常
- 編譯時(shí)異常:必須顯示處理,否則程序就會(huì)發(fā)生錯(cuò)誤,無(wú)法通過(guò)編譯
- 運(yùn)行時(shí)異常:無(wú)需顯示處理,也可以和編譯時(shí)異常一樣處理
-
常見(jiàn)運(yùn)行時(shí)異常:
- NullPointerException空指針異常
- IndexOutOfBoundsException索引越界異常
- ClassCastException類(lèi)轉(zhuǎn)換異常,如向下轉(zhuǎn)型時(shí)的不安全性
- IllegalArgumentException非法參數(shù)異常,如創(chuàng)建SimpleDateFormat時(shí)傳遞的日期格式不對(duì)
Java對(duì)異常的默認(rèn)處理方式:先根據(jù)產(chǎn)生錯(cuò)誤的異常類(lèi)創(chuàng)建該類(lèi)對(duì)象,然后通過(guò)throw將異常拋給上一級(jí),不斷向上拋出直到拋給了JVM,JVM拿到異常后就會(huì)將異常的名稱、異常原因、異常出現(xiàn)的位置等信息輸出在控制臺(tái)并終止程序。
-
Throwable常用成員方法:
// 將此throwable和其追溯打印到標(biāo)準(zhǔn)錯(cuò)誤流 ***常用 void printStackTrace() // 返回此throwable的詳細(xì)消息字符串 String getMessage() // 返回此可拋出的簡(jiǎn)短描述 String toString() -
異常處理之try...catch...:程序從try里面的代碼開(kāi)始執(zhí)行;出現(xiàn)異常,會(huì)自動(dòng)生成一個(gè)異常類(lèi)對(duì)象,該異常對(duì)象將被提交給Java運(yùn)行時(shí)系統(tǒng);當(dāng)Java運(yùn)行時(shí)系統(tǒng)接收到異常對(duì)象時(shí),會(huì)到catch中去找匹配的異常類(lèi),找到后進(jìn)行異常的處理;執(zhí)行完畢之后,程序還可以繼續(xù)往下執(zhí)行;被finally控制的語(yǔ)句一定會(huì)執(zhí)行,除非JVM退出
格式: try{ 可能出現(xiàn)異常的代碼; } catch(異常類(lèi)名 變量名) { 異常的處理代碼; } finally { 必須執(zhí)行的代碼; } try必須有,catch和finally只能省略一個(gè) 多catch的順序: 異常類(lèi)間沒(méi)有繼承關(guān)系,沒(méi)有順序 異常類(lèi)間有繼承關(guān)系,父類(lèi)異常寫(xiě)在下面 因?yàn)槎鄳B(tài)原因,父類(lèi)可以抓住子類(lèi)異常 盡量不要在異常處理中使用return: 1. 如果finally中有return,則程序會(huì)走finally中的return 2. 如果finally中沒(méi)有return,則先執(zhí)行try或者catch中的return,將其存入臨時(shí)棧中,執(zhí)行完finally語(yǔ)句后才返回臨時(shí)棧中的值 若finally中有return,則try...catch...finall外面的return會(huì)編譯報(bào)錯(cuò) 若try和catch中都有return,則try...catch...finall外面的return會(huì)編譯報(bào)錯(cuò) -
異常處理之throws:
格式:throws 異常類(lèi)名; throws: 用在方法聲明后面,跟的是異常類(lèi)名 表示拋出異常,由該方法的調(diào)用者來(lái)處理 表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這些異常 throw: 用在方法體內(nèi),跟的是異常對(duì)象名 表示拋出異常,由方法體內(nèi)的語(yǔ)句處理 執(zhí)行throw一定拋出了某種異常 -
自定義異常:繼承異常類(lèi)
// 自定義異常示例 public class MyException extends Exception { public MyException() { } public MyException(String message) { super(message); } } 由于多態(tài),繼承中子類(lèi)重寫(xiě)父類(lèi)方法時(shí),子類(lèi)拋出的異常不能大于父類(lèi)的異常;若父類(lèi)沒(méi)拋出異常,則子類(lèi)不能拋出編譯時(shí)異常(可以拋出運(yùn)行時(shí)異常),只能自己處理
若有錯(cuò)誤或補(bǔ)充,歡迎私信