coreJava_12——異常

/*
承認(rèn)差距硼讽,沉心靜氣……
(筆者最近就要找工作了捉偏,java的框架之類的還沒學(xué)好,最近可能更的不及時农渊。忙完這陣子我會再系統(tǒng)的整理一下這個coreJava系列患蹂,以及一些再面試和項目中的經(jīng)驗跟大家分享)
*/

簡書現(xiàn)在竟然要求綁定微信才可以發(fā)表,考慮換地方了

一砸紊、理解異常

1传于、所有異常類的祖先類為java.lang.Throwable類。它有兩個直接的子類:

  • 1醉顽、Error類:表示表示僅靠程序本身無法恢復(fù)的嚴(yán)重錯誤沼溜,比如內(nèi)存溢出。
  • 2游添、Exception類:表示程序本身無法處理的異常系草。又分為運行時異常和編譯時異常。
    • a.運行時異常:RuntimeException類及其子類都被稱為運行時異常唆涝,這種異常的特點是Java編譯器不會檢查它找都,也就是說,當(dāng)程序中 可能出現(xiàn)這類異常時廊酣,即使沒有用try...catch語句捕獲它檐嚣,也沒有用throws子句聲明拋出它,還是會編譯通過啰扛。JVM默認(rèn)會將異常的名稱嚎京、原因等問題輸出在控制臺,但同時程序中止運行隐解。
      運行時異常主要是由于代碼不嚴(yán)謹(jǐn)造成鞍帝,需要修改代碼。在程序調(diào)試階段煞茫,遇到這種異常時帕涌,正確的做法是改進程序的設(shè)計和實現(xiàn)方式,修改程序中的錯誤续徽,從而避免這種異常蚓曼。捕獲它并且使程序恢復(fù)運行并不是明智的辦法。
    • b钦扭、編譯時異常:必須進行處理的纫版,若不處理無法通過編譯。不是RuntimeException的異常都是編譯時異常客情。當(dāng)程序中可能出現(xiàn)這類異常時其弊,要么用try...catch語句捕獲它癞己,要么用throws子句聲明拋出它,否則編譯不會通過梭伐。一些常見運行時異常RuntimeException
      1.java.lang.ArithmeticException 算術(shù)異常如:除0;
      2.java.lang.NullPointerException空指針引用 如:沒初始化一個References便使用; 3.java.lang.ArrayIndexoutofBoundsException
      數(shù)組越界 如:調(diào)用一個有十個元素的Array的第十一個元素的內(nèi)容 4.java.lang.ClassCastException 強制類型轉(zhuǎn)換異常
      5.java.lang.NumberFormatException
      數(shù)據(jù)格式異常 如:Integer.parseInt("a");
      6.java.lang.NegativeArraySizeException 數(shù)組長度為負數(shù)異常

2痹雅、通過例子可以更好的理解

某天天氣很好,小明騎車去山里游玩

  • 問題1:山路塌陷了糊识,小明及時停住绩社,但是無法通過了。(嚴(yán)重問題Error)
  • 問題2:小明出門推自行車赂苗,發(fā)現(xiàn)輪胎沒氣了愉耙。小明,重新打好氣哑梳。(運行期就應(yīng)該檢查問題并處理)
  • 問題3:小明騎車在路上行駛著,山路兩邊有石子绘盟,但是中間時平坦的鸠真;
    一直在平坦的路上時沒有問題的,但是小明偏喜歡騎到石子上龄毡,結(jié)果爆胎吠卷,出現(xiàn)問題。

3沦零、異常聲明和處理——try...catch

--格式:
try{
可能出現(xiàn)問題的代碼
}catch(異常名 變量名){
針對問題的處理
}
catch(異常名 變量名){
針對問題的處理
}

  • 1.自己主動使用throw語句的時候代碼會拋出異常祭隔;

  • 2.使用try-catch-finally語句結(jié)構(gòu)處理或
    在方法聲明上聲明throws繼續(xù)拋出;
    (注意:a路操、try中的語句越少越好 b疾渴、catch中必須有內(nèi)容,用于處理以及提示等屯仗。)

    異常處理語句的語法規(guī)則:
    1.try代碼塊不能脫離catch代碼塊或finally代碼塊而單獨存在搞坝。try代碼塊后面至少有一個catch代碼塊或finally代碼塊。
    2.try代碼塊后面可以有零個或多個catch代碼塊魁袜,還可以有零個或至多一個finally代碼塊桩撮。如果catch代碼塊和finally代碼塊并存,finally代碼塊必須在catch代碼塊后面峰弹。
    3.try代碼塊后面可以只跟finally代碼塊店量。
    4.在try代碼塊中定義的變量的作用域為try代碼塊,在catch代碼塊和finally代碼塊中不能訪問該變量鞠呈。
    5.可以有多個catch語句時融师,注意一但try中出現(xiàn)問題,將會與后邊的catch里的問題進行匹配蚁吝,一旦有符合的诬滩,則執(zhí)行該catch里的處理語句霹粥,并結(jié)束當(dāng)前try...catch,繼續(xù)執(zhí)行后邊的程序疼鸟。
    (注意:catch中的異常為平級后控,那么先后順序不影響,只匹配符合的空镜,但是若時子父關(guān)系浩淘,那么,父必須放在后邊吴攒,否則张抄,匹配到父后,即不再匹配后邊其他的catch語句)
    6.如果一個方法可能出現(xiàn)編譯異常洼怔,要么用try...catch語句捕獲署惯,要么用throws子句聲明將它拋出。
    7.throw語句后面不允許緊跟其它語句镣隶,因為這些語句永遠不會被執(zhí)行极谊。

4、異常聲明和處理——throws和throw

  • 1安岂、throws
    定義功能方法時轻猖,需要把出現(xiàn)的問題暴露出來讓調(diào)用者處理,那么就通過throws在方法上標(biāo)識域那。
    格式:
    method() throws 異常名1咙边,異常名2...
    編譯期間異常拋出,將來調(diào)用必須處理次员,不 處理無法通過編譯败许;
    運行時異常拋出,將來調(diào)用可以不處理淑蔚。
  • 2檐束、throw
    在功能方法內(nèi)部出現(xiàn)某種情況,程序不能運行束倍,需要進行跳轉(zhuǎn)時被丧,就要用throw拋出異常的對象(注意不是異常名)

5、throws與throw區(qū)別(面試中常見):

throws
  • 用在方法聲明后面绪妹,跟的是異常類名
  • 可以跟多個異常類名甥桂,用逗號隔開
  • 表示拋出異常,有該方法的調(diào)用者來處理
  • throws表示出現(xiàn)異常的一種可能性邮旷,并不一定會發(fā)生這些異常
throw
  • 用在方法體內(nèi)黄选,跟的是異常對象名
  • 只能拋出一個異常對象名
  • 表示拋出異常,由方法體內(nèi)的語句處理
  • throw是拋出了異常,執(zhí)行throw一定是拋出某種異常
例:
public class ExceptionDemo1 {

    public static void main(String[] args) {
        ExceptionDemo1 ed = new ExceptionDemo1();
        try {
            ed.method2();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("已處理異常...");
        }

    }

    public void method2() throws Exception {    //throws是用在方法聲明后邊
        int a = 10;
        int b = 0;
        if (b == 0) {
            // throw ArithmeticException; //錯誤寫法办陷,throw拋出的不是名稱
            throw new Exception();// 拋出異常對象
        } else {
            System.out.println(a / b);

        }
    }
}

5貌夕、異常處理原則

如果該功能內(nèi)部可以將問題處理,用try民镜,如果處理不了啡专,交由調(diào)用者處理,這時用throws制圈。
區(qū)別:后續(xù)程序需要繼續(xù)運行们童,就用try;反之鲸鹦,則用throws慧库。

6、finally

  • 1馋嗜、finally的特點
    • finally的語句塊一定執(zhí)行
    • 特殊情況齐板,在執(zhí)行到finally之前JVM已經(jīng)退出(比如System.exit(0))
  • 2、finally的作用
    • 用于釋放資源葛菇,在IO操作和數(shù)據(jù)庫中會見到
  • 3甘磨、finally相關(guān)的面試題
    • 1、final熟呛,finally和finalize的區(qū)別
      • final:最終的意思宽档,可以修飾類(時尉姨,類不能被繼承)庵朝、成員變量(時,變量就是常量)又厉、成員方法(時九府,方法不能被重寫)。
      • finally:是異常處理的一部分用于釋放資源覆致。一般情況侄旬,代碼肯定會執(zhí)行,特殊情況煌妈,在執(zhí)行到finally之前jvm就退出的話將不執(zhí)行儡羔。
      • finalize:是Object類的一個方法,用于垃圾回收璧诵。
    • 2汰蜘、如果catch里面有return語句,請問finally的代碼還會執(zhí)行嗎之宿?如果會族操,請問是在return前還是后?
      • 會執(zhí)行比被,在return前色难。
        • 準(zhǔn)確的說泼舱,在中間。
public class FinallyDemo2 {
    private static int a=0;
    public static void main(String[] args) {
        System.out.println(TestTheReturn());//輸出30
        System.out.println("the current value of a is: "+ a);//輸出40
    }
    public static int TestTheReturn() {
        a = 10;
        try {
            System.out.println(a/0);
            a = 20;
        } catch (ArithmeticException e) {
            a = 30;
            return a;//#1
            //return a執(zhí)行到這里枷莉,不是return a了,而是return 30娇昙,這個返回路徑已經(jīng)形成
            //但是發(fā)現(xiàn)后邊還有finally語句,因此執(zhí)行finally語句的內(nèi)容依沮,a=40涯贞,
            //返回到原來的路徑,繼續(xù)執(zhí)行return 30危喉。
        }finally {
            a = 40;
            //return a; //#2
        }
        return a;//與#2處的return不能同時存在宋渔,跟該語句地位相同,沖突辜限。
        //對#1處而言皇拣,已經(jīng)有返回了;所以此處return語句并不執(zhí)行
    }
}

7薄嫡、自定義異常

有些異常氧急,Java中沒有對應(yīng)的異常,需要我們自定義來進行相關(guān)的異常處理毫深。如吩坝,檢查用戶輸入是否符合要求等。
自定義異常分為兩種

  • 繼承自Exception 編譯時異逞颇瑁——編譯要檢查

  • 繼承自RuntimeException 運行時異扯で蓿——編譯不需要檢查

    1、
    下面給出三個類:

//自定義異常類
package exception;
//也可以是繼承自RuntimeException
//public class MyException extends RuntimeException
public class MyException extends Exception{
    //提供構(gòu)造方法闸迷,用于逐層向上傳遞提示信息嵌纲,message
    //可通過查看api參考寫法。
    public MyException() {
    }
    public MyException(String message) {
        super(message);
    }
}

//檢查異常類
package exception;

public class Teacher {
    public void check(int score) throws MyException {

        if (score > 100 || score < 0) {
            throw new MyException("分?jǐn)?shù)必須在0——100之間");
        }else {
            System.out.println("分?jǐn)?shù)沒有問題");
        }
    }

}

//測試類
package exception;

import java.util.Scanner;

public class Student {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入成績:");
        int score = scanner.nextInt();
        
        Teacher t = new Teacher();
        try {
            t.check(score);
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}

8腥沽、小結(jié)一下

異常的注意事項

  • 子類重寫父類方法時逮走,子類的方法必須拋出相同的異常或者弗雷異常的子類今阳。
  • 如果父類拋出了多個異常师溅,子類重寫父類時,只能拋出相同的異扯苌啵或者時他的子類墓臭,子類不能拋出父類沒有的異常。
  • 如果被重寫的方法沒有異常拋出矿筝,那么子類的方法絕對不可以拋出異常起便,如果子類的方法內(nèi)有異常發(fā)生,那么子類就只能try,不能throws
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榆综,一起剝皮案震驚了整個濱河市妙痹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鼻疮,老刑警劉巖怯伊,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異判沟,居然都是意外死亡耿芹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門挪哄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吧秕,“玉大人,你說我怎么就攤上這事迹炼≡冶颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵斯入,是天一觀的道長砂碉。 經(jīng)常有香客問我,道長刻两,這世上最難降的妖魔是什么增蹭? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮磅摹,結(jié)果婚禮上滋迈,老公的妹妹穿的比我還像新娘。我一直安慰自己偏瓤,他們只是感情好杀怠,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布椰憋。 她就那樣靜靜地躺著厅克,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橙依。 梳的紋絲不亂的頭發(fā)上证舟,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音窗骑,去河邊找鬼女责。 笑死,一個胖子當(dāng)著我的面吹牛创译,可吹牛的內(nèi)容都是我干的抵知。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刷喜!你這毒婦竟也來了残制?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掖疮,失蹤者是張志新(化名)和其女友劉穎初茶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浊闪,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡恼布,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搁宾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片折汞。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盖腿,靈堂內(nèi)的尸體忽然破棺而出字支,到底是詐尸還是另有隱情,我是刑警寧澤奸忽,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布堕伪,位于F島的核電站,受9級特大地震影響栗菜,放射性物質(zhì)發(fā)生泄漏欠雌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一疙筹、第九天 我趴在偏房一處隱蔽的房頂上張望富俄。 院中可真熱鬧,春花似錦而咆、人聲如沸霍比。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悠瞬。三九已至,卻和暖如春涯捻,著一層夾襖步出監(jiān)牢的瞬間浅妆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工障癌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凌外,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓涛浙,卻偏偏與公主長得像康辑,于是被迫代替她去往敵國和親摄欲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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