java系列10:異常(Exception)

1、生活中的異常

2鳞疲、異常

程序中出現(xiàn)的錯(cuò)誤被稱為異常罪郊。

異常可分為兩大類:編譯時(shí)異常和運(yùn)行時(shí)異常尚洽。
異常就是在程序的運(yùn)行過(guò)程中所發(fā)生的不正常的事件悔橄,它會(huì)中斷正在運(yùn)行的程序。

編譯時(shí)異常一般是指語(yǔ)法錯(cuò)誤,可以通過(guò)編譯器的提示加以修正癣疟;

運(yùn)行時(shí)異常包括:

  • 運(yùn)行錯(cuò)誤:如數(shù)組下標(biāo)越界挣柬,除數(shù)為0等;
  • 邏輯錯(cuò)誤:如年齡超過(guò)200歲等睛挚。

3邪蛔、發(fā)生異常的原因

多種多樣,主要有:

  • 系統(tǒng)資源不可用:如內(nèi)存分配失敗扎狱,文件打開失敗侧到,數(shù)據(jù)源連接失敗等等;
  • 程序控制不當(dāng):如被零除淤击,負(fù)數(shù)開方匠抗,數(shù)組下標(biāo)越界等等。

4污抬、當(dāng)異常發(fā)生時(shí)汞贸,程序一般會(huì)如下反應(yīng):

  • 發(fā)生異常的部分產(chǎn)生系統(tǒng)定義的錯(cuò)誤信息;
  • 程序意外終止印机,并將控制權(quán)返回操作系統(tǒng)矢腻;
  • 程序中所有已分配資源的狀態(tài)保持不變,這樣將會(huì)導(dǎo)致資源泄漏射赛。

5多柑、異常處理

Java編程語(yǔ)言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力。

6咒劲、java異常處理機(jī)制

5個(gè)關(guān)鍵字
異常類體系結(jié)構(gòu)圖

Throwable有兩個(gè)直接子類顷蟆,它們是:
Error類:Error類的異常通常為內(nèi)部錯(cuò)誤诫隅,因此在正常情況下并不期望用戶程序捕獲它們腐魂;
Exception類:絕大部分用戶程序應(yīng)當(dāng)捕獲的異常類的根類;
一些常用的異常類都直接或間接派生自Exception類逐纬,因此我們可以認(rèn)為絕大部分的異常都屬于Exception蛔屹。

7、Java中常見(jiàn)的異常類

java中常見(jiàn)的異常類

8豁生、異常類中的常用方法

printStackTrace的堆棧跟蹤功能顯示出程序運(yùn)行到當(dāng)前類的執(zhí)行流程兔毒。

printStackTrace

9、多重catch塊

有時(shí)候甸箱,在try塊中的代碼段將有可能產(chǎn)生多種不同類型的異常育叁,而我們又需要針對(duì)不同的異常類型進(jìn)行不同的處理方式,那么我們就可以使用多重catch塊芍殖,來(lái)分別捕獲不同類型的異常豪嗽。

雖然多重catch塊可以同時(shí)監(jiān)視多個(gè)不同類型的異常,但是try塊中一旦有某個(gè)異常產(chǎn)生,程序就會(huì)跳轉(zhuǎn)到與之異常類型最匹配的catch塊中執(zhí)行龟梦,然后執(zhí)行finally塊(如果有finally塊的話)或之后的語(yǔ)句隐锭;
也就是說(shuō),多重catch塊只會(huì)捕捉到最先產(chǎn)生的異常计贰,而不是把所有的異常全部捕捉完钦睡;
即:不論有多少個(gè)catch塊,最多只會(huì)執(zhí)行其中的一個(gè)躁倒;
請(qǐng)注意catch塊的書寫順序:類層次越低的越往上寫荞怒,越高的越往下寫。

例子

10樱溉、嵌套try/catch塊

有時(shí)候挣输,整個(gè)語(yǔ)句塊可以產(chǎn)生異常,而其中的某個(gè)部分又可能產(chǎn)生另外的異常福贞,而我們需要分別進(jìn)行處理撩嚼;
這樣,就可以通過(guò)嵌套try/catch塊來(lái)完成挖帘;
嵌套try/catch塊就是在一個(gè)try/catch塊中包含有另外的try/catch塊完丽。

嵌套try/catch塊

例1:除0錯(cuò)誤

package test;

public class TestException {
    public static void main(String[] args) {
        System.out.println("結(jié)果:"+ 3/0);
    }
}
除0錯(cuò)誤

例2:輸入的字符和整數(shù)不匹配

package test;

import java.util.Scanner;

public class TestException {
    public static void main(String[] args) {
        int a = new Scanner(System.in).nextInt();
        System.out.println("輸入的數(shù)字是:" + a);
    }
}
輸入的字符和整數(shù)不匹配

例3:數(shù)組下標(biāo)越界

package test;

import java.util.Scanner;

public class TestException {
    public static void main(String[] args) {
        int[] b = new int[]{3,5,8};
        b[3] = 7;
        System.out.println("數(shù)組b編號(hào)為3的整數(shù):" + b[3]);
    }
}
數(shù)組下標(biāo)越界

例4:try-catch-finally

package test;

import java.util.Scanner;

public class TestException {
    public static void main(String[] args) {
        try {
            System.out.println("結(jié)果:"+ 3/0);
            int[] b = new int[]{3,5,8};
            b[3] = 7;
            System.out.println("數(shù)組b編號(hào)為3的整數(shù):" + b[3]);
        } catch (Exception e1) {
            String m = e1.getMessage();
            System.out.println("錯(cuò)誤信息:"+m);

            e1.printStackTrace();
    }finally{
        System.out.println("你好異常");
    }
    }
}
結(jié)果

11、throw

throw語(yǔ)句用于手動(dòng)拋出異常拇舀;
執(zhí)行流程將在throw語(yǔ)句后立即停止逻族,轉(zhuǎn)而尋找與之類型相匹配的catch塊。

throw語(yǔ)句的語(yǔ)法是:

throw (異常類型的實(shí)例);

例子:

// Student.java
package test;

public class Student {
    int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        try {
            if(age > 150 || age < 0) {
                throw new Exception("年齡不允許大于150或者小于0");
            }
            this.age = age;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// Test.java
package test;

public class Test {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setAge(250);
    }
}
運(yùn)行結(jié)果

12骄崩、throws

如果某個(gè)函數(shù)中的代碼有可能引發(fā)異常聘鳞,可以使用try/catch塊進(jìn)行處理,這種處理方式成為“內(nèi)部處理”要拂;
如果不方便在函數(shù)內(nèi)部進(jìn)行處理抠璃,也可以將異常往函數(shù)外部傳遞,這就要使用到關(guān)鍵字throws脱惰;
throws用于將函數(shù)內(nèi)部產(chǎn)生的異常拋給主調(diào)函數(shù)搏嗡。

一般語(yǔ)法:

返回值類型 函數(shù)名(參數(shù)列表) throws 異常類型 {
    ……
}

例子:

// Student.java
package test;

public class Student {
    int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) throws Exception {  // 年齡賦值的方法有可能會(huì)拋出異常
        this.age = age;
    }
}

// Test.java
package test;

public class Test {
    public static void main(String[] args) {
        Student stu = new Student();
        try {    
        // 當(dāng)調(diào)用帶有throws關(guān)鍵字的函數(shù)時(shí),則必須放在try/catch塊中進(jìn)行監(jiān)控拉一,否則編譯器將會(huì)報(bào)錯(cuò)
            stu.setAge(250);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// Test.java
// 同樣地采盒,如果不便進(jìn)行監(jiān)控處理,也可以繼續(xù)使用throws往外拋出異常蔚润,但不太推薦此種做法磅氨。

package test;

public class Test {
    public static void main(String[] args) throws Exception {
        Student stu = new Student();
        stu.setAge(250);
    }
}

13、自定義異常

Exception類和其子類都是系統(tǒng)內(nèi)置的異常嫡纠,這些異常不一定總能捕獲程序中發(fā)生的所有異常烦租;
有時(shí)候决瞳,我們可能要?jiǎng)?chuàng)建用戶自定義的異常類;
用戶自定義異常類應(yīng)該是Exception類的子類左权,類似于:

class MyException extends Exception{
    ……
}
例子
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皮胡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赏迟,更是在濱河造成了極大的恐慌屡贺,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锌杀,死亡現(xiàn)場(chǎng)離奇詭異甩栈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)糕再,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門量没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人突想,你說(shuō)我怎么就攤上這事殴蹄。” “怎么了猾担?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵袭灯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绑嘹,道長(zhǎng)稽荧,這世上最難降的妖魔是什么粒蜈? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任窗怒,我火速辦了婚禮,結(jié)果婚禮上埃难,老公的妹妹穿的比我還像新娘擅腰。我一直安慰自己蟋恬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布惕鼓。 她就那樣靜靜地躺著筋现,像睡著了一般唐础。 火紅的嫁衣襯著肌膚如雪箱歧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天一膨,我揣著相機(jī)與錄音呀邢,去河邊找鬼。 笑死豹绪,一個(gè)胖子當(dāng)著我的面吹牛价淌,可吹牛的內(nèi)容都是我干的申眼。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼蝉衣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼括尸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起病毡,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤濒翻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后啦膜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體有送,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年僧家,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雀摘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡八拱,死狀恐怖阵赠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肌稻,我是刑警寧澤豌注,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站灯萍,受9級(jí)特大地震影響轧铁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旦棉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一齿风、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绑洛,春花似錦救斑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绑蔫,卻和暖如春运沦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背配深。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工携添, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篓叶。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓烈掠,卻偏偏與公主長(zhǎng)得像羞秤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子左敌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Java異常類型 所有異常類型都是Throwable的子類瘾蛋,Throwable把異常分成兩個(gè)不同分支的子類Erro...
    予別她閱讀 924評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法矫限,內(nèi)部類的語(yǔ)法瘦黑,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法奇唤,線程的語(yǔ)...
    子非魚_t_閱讀 31,603評(píng)論 18 399
  • 通俗編程——白話JAVA異常機(jī)制 - 代碼之道幸斥,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語(yǔ)閱讀 3,174評(píng)論 0 25
  • 回憶拉長(zhǎng)了纏綿卻斷了腸 深夜成了買醉的惆悵 在這一場(chǎng)沾不到邊的戰(zhàn)役 我輸給了你影子的把戲 想著花開之時(shí)花卻依舊不動(dòng)...
    一只有野心的狐貍閱讀 198評(píng)論 0 0
  • 訪問(wèn)官網(wǎng)Butterknife中有最近引用的版本 引用的時(shí)候可能會(huì)報(bào)gradle沒(méi)有apt方法的錯(cuò)誤: 解決方法是...
    Fizzer閱讀 630評(píng)論 0 0