Java異常

Throwable類

Throwable類是整個異常體系類的父級類,它實(shí)現(xiàn)了Serializable接口,它的父類是Object類金麸,它的子類有Exception和Error,這2個子類下面都有很多子類簿盅。

  • Error是程序發(fā)生了重大錯誤挥下,不能解決,只能避免桨醋,比如:內(nèi)存泄漏

  • Exception:可對其進(jìn)行處理的異常

20160907101613.jpg

受檢異常和非受檢異常

  • 受檢異常(checkedException):程序必須處理該異常棚瘟。除了RuntimeExcetion及其子類(運(yùn)行時異常),其他的Exception及其子類都屬于受檢異常喜最,這種異常的特點(diǎn)是java編譯器會檢查它偎蘸,當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語句捕獲它瞬内,要么用throws子句聲明拋出它迷雪,否則編譯不會通過。

  • 非受檢異常(uncheckedException):編譯器不要求強(qiáng)制處置的異常虫蝶。包括運(yùn)行時異常(RuntimeException與其子類)和錯誤(Error)章咧。

QQ截圖20180417153847.png

運(yùn)行時與非運(yùn)行時異常

Exception 這種異常分兩大類運(yùn)行時異常和非運(yùn)行時異常(編譯異常)。程序中應(yīng)當(dāng)盡可能去處理這些異常能真。

運(yùn)行時異常:都是RuntimeException類及其子類異常赁严,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等粉铐,這些異常是非受檢異常疼约,程序中可以選擇捕獲處理,也可以不處理秦躯。這些異常一般是由程序邏輯錯誤引起的忆谓,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。

運(yùn)行時異常的特點(diǎn)是Java編譯器不會檢查它踱承,也就是說,當(dāng)程序中可能出現(xiàn)這類異常茎活,即使沒有用try-catch語句捕獲它昙沦,也沒有用throws子句聲明拋出它,也會編譯通過载荔。

非運(yùn)行時異常 (編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過舆驶。如IOException而钞、SQLException等以及用戶自定義的Exception異常沙廉,不過一般情況下不自定義檢查異常撬陵。

異常處理

程序運(yùn)行過程中可能會出現(xiàn)異常情況,比如被0除官疲、對負(fù)數(shù)計算平方根等袱结,還有可能會出現(xiàn)致命的錯誤,比如內(nèi)存不足途凫,磁盤損壞無法讀取文件等垢夹,對于異常和錯誤情況的處理,統(tǒng)稱為異常處理维费。

Java異常處理主要通過5個關(guān)鍵字控制:try果元、catch、throw犀盟、throws和finally而晒。try的意思是試試它所包含的代碼段中是否會發(fā)生異常;而catch當(dāng)有異常時抓住它阅畴,并進(jìn)行相應(yīng)的處理倡怎,使程序不受異常的影響而繼續(xù)執(zhí)行下去;throw是在程序中明確引發(fā)異常贱枣;throws的作用是如果一個方法可以引發(fā)異常监署,而它本身并不對該異常處理,那么它必須將這個異常拋給調(diào)用它的方法纽哥;finally是無論發(fā)不發(fā)生異常都要被執(zhí)行的代碼钠乏。

關(guān)鍵字:throw,throws,try和catch的用法如下:

  1. throws出現(xiàn)在方法的聲明中,表示該方法可能會拋出的異常春塌,允許throws后面跟著多個異常類型

  2. throw出現(xiàn)在方法體中晓避,用于拋出異常簇捍。當(dāng)方法在執(zhí)行過程中遇到異常情況時,將異常信息封裝為異常對象俏拱,然后throw暑塑。

  3. try出現(xiàn)在方法體中,它自身是一個代碼塊锅必,表示嘗試執(zhí)行代碼塊的語句梯投。如果在執(zhí)行過程中有某條語句拋出異常,那么代碼塊后面的語句將不被執(zhí)行况毅。一個try后面可以跟多個catch,但不管多少個尔艇,最多只會有一個catch塊被執(zhí)行尔许。

  4. catch出現(xiàn)在try代碼塊的后面,自身也是一個代碼塊终娃,用于捕獲異常try代碼塊中可能拋出的異常味廊。catch關(guān)鍵字后面緊接著它能捕獲的異常類型,所有異常類型的子類異常也能被捕獲棠耕。

常見的異常:

  • NullPointerException 空指針異常

  • ArrayIndexOutOfBoundsException 數(shù)組下標(biāo)越界異常

  • StringIndexOutOfBoundsException 字符串下標(biāo)越界異常

  • ClassCastException 類型轉(zhuǎn)換異常

  • NumberFormatException 數(shù)字轉(zhuǎn)換異常


代碼示例

下面來看看代碼余佛,從代碼中深刻理解Exception

例1:

  Scanner scanner = new Scanner(System.in);
  // 下面可以引發(fā)InputMismatchException,為非受檢異常
  int i = scanner.nextInt();//這里定義為int,如果鍵盤輸入為string類型則會出現(xiàn)異常
  System.out.println(i);

  // 下面這個是受檢異常窍荧,必須處理辉巡,否則編譯不通過
  try {
    Thread.sleep(1000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }

例2:

  int i;
  Scanner scanner = new Scanner(System.in);
  try {// 放可能發(fā)生異常的代碼塊
    i = scanner.nextInt();
  } catch (InputMismatchException e) {
    System.out.println("捕獲到了InputMismatchException");
  } catch (Exception e) {// 捕獲異常,對異常的處理
    System.out.println("發(fā)生了異常");
    e.printStackTrace();
  } finally {// 始終要執(zhí)行的代碼
    System.out.println("無論有沒有發(fā)生異常我是一定會執(zhí)行的");
  }
  System.out.println("----程序結(jié)束");

將上面的代碼運(yùn)行2次輸出結(jié)果分別是:

第一次輸入123結(jié)果

123

無論有沒有發(fā)生異常我是一定會執(zhí)行的

----程序結(jié)束

第二次輸入asdf結(jié)果

asdf

捕獲到了InputMismatchException

無論有沒有發(fā)生異常我是一定會執(zhí)行的

----程序結(jié)束

由這2次結(jié)果可以看出蕊退,finally不能是否發(fā)生異常都執(zhí)行了郊楣;try后面可以跟著多個catch,但是最多只能執(zhí)行一個catch瓤荔【辉椋可以在try后面加任意數(shù)量的catch塊,如果try中的代碼發(fā)生異常输硝,異常被拋給第一個catch快今瀑,如果拋出異常的數(shù)據(jù)類型與第一個catch類型匹配,它就在這里被捕獲点把,如果不匹配橘荠,它會傳入第二個catch塊,以此類推知道最后一個catch塊愉粤。

例3:

  public static void main(String[] args) {
    int a = 10, b = -4;
    int result;
    try {
      result = div(a, b);
      System.out.println("result=" + result);
    } catch (Exception e) {
      System.out.println("捕獲到了異常");
      System.out.println(e.getMessage());
    }
    System.out.println("---程序結(jié)束");
  }

  // 在方法后面用throws關(guān)鍵字 把異常拋出去砾医,誰調(diào)用誰處理
  public static int div(int a, int b) throws Exception {
    if (b < 0) {
    // 使用throw拋出一個異常
      throw new Exception("被除數(shù)不能小于0");
    }
    if (b == 0) {
    // 使用throw拋出一個異常
      throw new Exception("被除數(shù)不能為0");
    }
    return a / b;
  }

輸出為:

捕獲到了異常

被除數(shù)不能小于0

---程序結(jié)束

這個例子是自定義什么條件下拋出異常,我們定義了被除數(shù)為0或者被除數(shù)小于0時拋出異常衣厘,并通過throws把異常拋出如蚜,誰調(diào)用這個方法压恒,誰就處理這個異常或者繼續(xù)拋出错邦。


擴(kuò)展:錯誤和異常的區(qū)別(Error vs Exception)

1)java.lang.Error:Throwable的子類探赫,用于標(biāo)記嚴(yán)重錯誤。合理的應(yīng)用程序不應(yīng)該去try/catch這種錯誤撬呢。絕大多數(shù)的錯誤都是非正常的伦吠,就根本不該出現(xiàn)的。

2)java.lang.Exception: Throwable的子類魂拦,用于指示一種合理的程序想去catch的條件毛仪。即它僅僅是一種程序運(yùn)行條件,而非嚴(yán)重錯誤芯勘,并且鼓勵用戶程序去catch它箱靴。

擴(kuò)展:錯誤和異常的區(qū)別(Error vs Exception)
1)java.lang.Error: Throwable的子類,用于標(biāo)記嚴(yán)重錯誤荷愕。合理的應(yīng)用程序不應(yīng)該去try/catch這種錯誤衡怀。絕大多數(shù)的錯誤都是非正常的,就根本不該出現(xiàn)的安疗。
2)java.lang.Exception: Throwable的子類抛杨,用于指示一種合理的程序想去catch的條件。即它僅僅是一種程序運(yùn)行條件荐类,而非嚴(yán)重錯誤怖现,并且鼓勵用戶程序去catch它。


聲明自定義異常

在java中可以自定義異常掉冶,編寫自己自定義的異常時需要注意:

  • 所有異常都必須是Throwable的子類
  • 如果希望寫一個受檢異常類真竖,則需要繼承Exception類
  • 如果希望寫一個運(yùn)行時異常類,那么需要繼承RuntimeException類

請尊重作者勞動成果厌小,轉(zhuǎn)載請標(biāo)明原文鏈接:http://www.reibang.com/p/aaf0103604d8

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恢共,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子璧亚,更是在濱河造成了極大的恐慌讨韭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣蟋,死亡現(xiàn)場離奇詭異透硝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疯搅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門濒生,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幔欧,你說我怎么就攤上這事罪治±錾” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵觉义,是天一觀的道長雁社。 經(jīng)常有香客問我,道長晒骇,這世上最難降的妖魔是什么霉撵? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮洪囤,結(jié)果婚禮上徒坡,老公的妹妹穿的比我還像新娘。我一直安慰自己瘤缩,他們只是感情好崭参,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著款咖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奄喂。 梳的紋絲不亂的頭發(fā)上铐殃,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音跨新,去河邊找鬼富腊。 笑死,一個胖子當(dāng)著我的面吹牛域帐,可吹牛的內(nèi)容都是我干的赘被。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼肖揣,長吁一口氣:“原來是場噩夢啊……” “哼民假!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起龙优,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤羊异,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彤断,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體野舶,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年宰衙,在試婚紗的時候發(fā)現(xiàn)自己被綠了平道。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡供炼,死狀恐怖一屋,靈堂內(nèi)的尸體忽然破棺而出窘疮,到底是詐尸還是另有隱情,我是刑警寧澤陆淀,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布考余,位于F島的核電站,受9級特大地震影響轧苫,放射性物質(zhì)發(fā)生泄漏楚堤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一含懊、第九天 我趴在偏房一處隱蔽的房頂上張望身冬。 院中可真熱鬧,春花似錦岔乔、人聲如沸酥筝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘿歌。三九已至,卻和暖如春茁影,著一層夾襖步出監(jiān)牢的瞬間宙帝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工募闲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留步脓,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓浩螺,卻偏偏與公主長得像靴患,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子要出,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345