JAVA基礎(chǔ)篇(2)-異常

JAVA && Spring && SpringBoot2.x — 學(xué)習(xí)目錄

異常類

1. Exception異常

1.1 運(yùn)行時(shí)異常

運(yùn)行時(shí)異常(unchecked未經(jīng)檢查的異常)RuntimeException及其子類是未經(jīng)檢查的異常 慷荔。運(yùn)行時(shí)異常的特點(diǎn)就是Java編譯期不會(huì)檢查它雕什,也就是說,當(dāng)程序中可能出現(xiàn)這類異常時(shí)显晶,既可以不使用try-catch捕獲它贷岸,也可以不使用throws字句聲明它,也可以編譯通過磷雇。

如下圖:

public void testRuntimeException() {
        throw new RuntimeException("我并不需要捕獲或拋出");
    }

1.2 檢查時(shí)異常

非運(yùn)行時(shí)異常(檢查異常):Exception類中除RuntimeException之外的異常偿警。從語法上是必須要進(jìn)行處理的,不然編譯不過去唯笙。如IOException螟蒸、SQLException等以及(敲黑板,劃重點(diǎn))用戶自定義的Exception異常崩掘。出現(xiàn)檢查時(shí)異常七嫌。要么try-catch捕獲它,要么throws拋出它苞慢。


2. try-catch-finally的關(guān)系

2.1 catch里面返回诵原,會(huì)執(zhí)行finally的代碼嗎?

  public static int testFinally() {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            return 1;
        } finally {
            System.out.println("你猜我執(zhí)行了嗎");
        }
        return 2;
    }
 public static void main(String[] args) {
        System.out.println(TestObject.testFinally());
    }
  1. try-catch-finally塊中即使含有returnbreak皮假、continue等改變執(zhí)行流的關(guān)鍵字鞋拟,finally也會(huì)執(zhí)行骂维。
  2. finally執(zhí)行完畢惹资,便執(zhí)行catch中的return返回。
1輸出結(jié)果

2.2 try-catch-finally均有返回航闺,到底返回誰褪测?

public static int testFinally() {
        try {
            int i = 1 / 0;
            return 1;
        } catch (Exception e) {
            System.out.println("我是打醬油的,我會(huì)不會(huì)被輸出");
            return 2;
        } finally {
            return 3;
        }
    }

因?yàn)?code>finally一定會(huì)執(zhí)行潦刃,那么最后返回的一定是finallyreturn侮措。但是只是return返回被覆蓋,需要注意的是邏輯代碼還是會(huì)執(zhí)行的乖杠。

2返回結(jié)果

2.3. finally里面返回分扎,catch拋出異常會(huì)執(zhí)行嗎。

可以看到胧洒,我們拋出的檢查時(shí)異常畏吓,但是并未編譯錯(cuò)誤。是不是和上面理論有沖突卫漫?

image.png

不是的菲饼!我們?cè)?code>finally中使用了return,那么catch里面的throw將被忽略列赎。

運(yùn)行結(jié)果:

3運(yùn)行結(jié)果

2.4. finally和catch均拋出異常宏悦,到底執(zhí)行誰?

可以看到包吝,均是拋出的exception異常饼煞,但是finally里面需要throws或者捕獲,那么最終還是以finally里面的代碼為準(zhǔn)的诗越。

執(zhí)行代碼

2.5在try-finally中的值傳遞和引用傳遞(重點(diǎn))

  public static int test(int x, int y) {
        int result = x;
        try {
            result = x + y;
            System.out.println("try中的結(jié)果:"+result);
            //返回的基本數(shù)據(jù)類型砖瞧,在執(zhí)行finally中,其實(shí)是值傳遞
            return result;
        } finally {
            result = x - y;
            System.out.println("result中的結(jié)果:"+result);
        }
    }
    public static void main(String[] args) {
        int x = 3;
        int y = 5;
        int result = test(5, 3);
        System.out.println(result);
    }

返回結(jié)果:

try-finally的執(zhí)行結(jié)果

是不是很驚奇2粲鳌0沤臁!

2.6總結(jié)及建議

try{}中包含return感耙,那么return時(shí)褂乍,先將返回結(jié)果記錄。再執(zhí)行finally即硼。

  1. 如果finally也有return逃片,則finally中的return會(huì)覆蓋try中的返回值,否則將記錄的結(jié)果返回。
  2. 如果finally沒有return褥实,若是修改了try{}中的返回值數(shù)據(jù)呀狼,那么return就會(huì)被修改,若是基本數(shù)據(jù)损离,那么try{ return}不會(huì)修改哥艇。
    需要注意的是:Java里面是值傳遞,如果本身是基本數(shù)據(jù)類型僻澎,數(shù)據(jù)不會(huì)收到影響貌踏,如果是引用類型,數(shù)據(jù)會(huì)改變窟勃。

有點(diǎn)繞...
為了不給后來人挖坑祖乳,我們需要記住:

  1. 不要在finally中使用return或者拋出異常秉氧。
  2. 減輕finally工作量眷昆,不要在finally中做其他的事情,finally最好僅僅用來釋放資源最合適汁咏。
  3. 盡量不在try-catch-finally里面使用return亚斋,將其放在函數(shù)最后面。

3. 項(xiàng)目中異常處理

拋出的異常經(jīng)過try-catch處理之后梆暖,若未繼續(xù)拋出新的異常伞访,那么便像正常程序一樣繼續(xù)向下執(zhí)行。即執(zhí)行完畢try-catch不會(huì)結(jié)束程序轰驳。

異常類可保存錯(cuò)誤碼和錯(cuò)誤信息

public class BusinessException extends RuntimeException {
    //繼承的頂級(jí)父類實(shí)現(xiàn)了序列化接口厚掷,子類還是需要顯示的聲明SerialVersionUID。
    private static final long serialVersionUID = -3516896655779527315L;
    /**
     * 保存用戶錯(cuò)誤碼
     */
    private String code = "";
    public BusinessException() {
        super();
    }
    public BusinessException(String message) {
        super(message);
    }
    public BusinessException(String message, Throwable cause) {
        super(message, cause);
    }
    public BusinessException(Throwable cause) {
        super(cause);
    }
    public BusinessException(String code, String message) {
        super(message); //調(diào)用父類的this.message=message;
        this.code = code;
    }
    public BusinessException(String code, String message, Throwable cause) {
        super(message, cause); //調(diào)用父類的構(gòu)造方法级解,減少重復(fù)代碼
        this.code = code;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
}

參考:
Java異趁昂冢總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市勤哗,隨后出現(xiàn)的幾起案子抡爹,更是在濱河造成了極大的恐慌,老刑警劉巖芒划,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冬竟,死亡現(xiàn)場離奇詭異,居然都是意外死亡民逼,警方通過查閱死者的電腦和手機(jī)泵殴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拼苍,“玉大人笑诅,你說我怎么就攤上這事。” “怎么了吆你?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵弦叶,是天一觀的道長。 經(jīng)常有香客問我妇多,道長伤哺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任砌梆,我火速辦了婚禮默责,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咸包。我一直安慰自己,他們只是感情好杖虾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布烂瘫。 她就那樣靜靜地躺著,像睡著了一般奇适。 火紅的嫁衣襯著肌膚如雪坟比。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天嚷往,我揣著相機(jī)與錄音葛账,去河邊找鬼。 笑死皮仁,一個(gè)胖子當(dāng)著我的面吹牛籍琳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贷祈,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼趋急,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了势誊?” 一聲冷哼從身側(cè)響起呜达,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粟耻,沒想到半個(gè)月后查近,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挤忙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年霜威,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饭玲。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侥祭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矮冬,我是刑警寧澤谈宛,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站胎署,受9級(jí)特大地震影響吆录,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琼牧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一恢筝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巨坊,春花似錦撬槽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至占调,卻和暖如春暂题,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背究珊。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工薪者, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剿涮。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓言津,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幔虏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纺念,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345