阿里Java開發(fā)手冊(cè)思考(五)

題圖:by pixel2013 From pixabay

上期我們分享了Java中日志的處理(下):Java中日志實(shí)際使用中的相關(guān)注意點(diǎn)

本期我們將分享Java中異常的處理

異常定義

在《java編程思想》中這樣定義異常:阻止當(dāng)前方法或作用域繼續(xù)執(zhí)行的問(wèn)題拄轻。

異常分類

首先我們看下Java中異常的繼承關(guān)系:

可以看出,Throwable有兩個(gè)子類:ErrorException

  • Error
    • VirtualMachineError橄维,典型的有StackOverFlowOutOfMemory
    • AWTError
  • Exception
    • IOException
    • ...
    • RuntimeException

Exception分為CheckedException和UncheckedException,那么CheckedException和UncheckedException區(qū)別是什么呢涌穆?

  • UncheckedException:派生于Error或者RuntimeException的異常
  • CheckedException:所有其他的異常

異常處理機(jī)制

異常處理機(jī)制分為:拋出異常和捕捉異常

拋出異常:方法上使用throws,方法內(nèi)使用throw
捕捉異常:使用try-catch或者try-catch-finally

原則,正如手冊(cè)上所說(shuō):

  • 不要直接忽略異常
  • 不要用try-catch包住太多語(yǔ)句
  • 不要用異常處理來(lái)處理程序的正嘲寤螅控制流
  • 不要隨便將異常迎函數(shù)棧向上傳遞裆熙,能處理盡量處理

何時(shí)向上傳播端礼?

  • 當(dāng)你認(rèn)為本異常應(yīng)該由上層處理時(shí),才向上傳播

注意點(diǎn)

  • finally語(yǔ)句塊一定會(huì)執(zhí)行嗎入录?

不一定會(huì)蛤奥,以下兩種情況finally語(yǔ)句塊不會(huì)執(zhí)行

  1. 未執(zhí)行到try語(yǔ)句塊
  2. try語(yǔ)句塊中有System.exit(0);
  • finally語(yǔ)句塊的執(zhí)行順序

首先看沒(méi)有控制語(yǔ)句的情況:

public static void main(String[] args) {
    try {
        System.out.println("try block");
    } finally {
        System.out.println("finally block");
    }
}

輸出沒(méi)有疑問(wèn):
try block
finally block

1、如果try中有控制語(yǔ)句(return僚稿、break凡桥、continue),那finally語(yǔ)句塊是在控制轉(zhuǎn)義語(yǔ)句之前執(zhí)行還是之后執(zhí)行蚀同?

private static String test1() {
    System.out.println("test1()");
    return "return";
}

private static String test() {
    try {
        System.out.println("try block");
        return test1();
    } finally {
        System.out.println("finally block");
    }
}

public static void main(String[] args) {
    System.out.println(test());
}

輸出:
try block
test1()
finally block
return

所以說(shuō)缅刽,如果try中有控制語(yǔ)句(returnbreak蠢络、continue)拷恨,那finally語(yǔ)句塊是在控制轉(zhuǎn)義語(yǔ)句之前執(zhí)行

2、如果catch語(yǔ)句中有控制語(yǔ)句(return谢肾、break腕侄、continue),那finally語(yǔ)句塊是在控制轉(zhuǎn)義語(yǔ)句之前執(zhí)行還是之后執(zhí)行?

private static String test1() {
    System.out.println("test1()");
    return "return";
}

private static String test() {
    try {
        System.out.println("try block");
        System.out.println(1 / 0);
        return test1();
    } catch (Exception e) {
        System.out.println("catch block");
        return test1();
    } finally {
        System.out.println("finally block");
    }
}

public static void main(String[] args) {
    System.out.println(test());
}

輸出:
try block
catch block
test1()
finally block
return

所以說(shuō)冕杠,如果catch語(yǔ)句中有控制語(yǔ)句(return微姊、breakcontinue)分预,那finally語(yǔ)句塊是在控制轉(zhuǎn)義語(yǔ)句之前執(zhí)行

  • finally里的變量
public static int test() {
    int i = 0;
    try {
        return i;
    } finally {
        i++;
    }
}

public static void main(String[] args) {
    System.out.println(test());
}

輸出:
0

咦兢交?很奇怪,為什么是0笼痹,而不是1呢配喳?

通過(guò)反編譯生成的class,我們就能知道原因了

int i = 0;
try {
    return i;
} finally {
    int iTemp = i++;
}

原來(lái)凳干,i++后只是賦值給了一個(gè)新的局部變量晴裹,i本身并沒(méi)有變,這一點(diǎn)和函數(shù)的形參一樣救赐,如果傳的是引用類型的涧团,那么值會(huì)變,如果傳的不是引用類型经磅,那么值是不會(huì)改變的泌绣,改變的也只是局部變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末预厌,一起剝皮案震驚了整個(gè)濱河市阿迈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轧叽,老刑警劉巖仿滔,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異犹芹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鞠绰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門腰埂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜈膨,你說(shuō)我怎么就攤上這事屿笼。” “怎么了翁巍?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵驴一,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我灶壶,道長(zhǎng)肝断,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮胸懈,結(jié)果婚禮上担扑,老公的妹妹穿的比我還像新娘。我一直安慰自己趣钱,他們只是感情好涌献,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著首有,像睡著了一般燕垃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上井联,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天卜壕,我揣著相機(jī)與錄音,去河邊找鬼低矮。 笑死印叁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的军掂。 我是一名探鬼主播轮蜕,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝗锥!你這毒婦竟也來(lái)了跃洛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤终议,失蹤者是張志新(化名)和其女友劉穎汇竭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穴张,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡细燎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皂甘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玻驻。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖偿枕,靈堂內(nèi)的尸體忽然破棺而出璧瞬,到底是詐尸還是另有隱情,我是刑警寧澤渐夸,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布嗤锉,位于F島的核電站,受9級(jí)特大地震影響墓塌,放射性物質(zhì)發(fā)生泄漏瘟忱。R本人自食惡果不足惜奥额,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酷誓。 院中可真熱鬧披坏,春花似錦、人聲如沸盐数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玫氢。三九已至帚屉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漾峡,已是汗流浹背攻旦。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留生逸,地道東北人牢屋。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像槽袄,于是被迫代替她去往敵國(guó)和親烙无。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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

  • 八遍尺、深入理解java異常處理機(jī)制 引子try…catch…finally恐怕是大家再熟悉不過(guò)的語(yǔ)句了截酷, 你的答案是...
    壹點(diǎn)零閱讀 1,578評(píng)論 0 0
  • Java關(guān)鍵字的大致含義 關(guān)鍵字 含義 表明類或者成員方法具有抽象屬性 abstract 用來(lái)進(jìn)行程序調(diào)試 ass...
    殘?jiān)掠昙娂?/span>閱讀 374評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法乾戏,內(nèi)部類的語(yǔ)法迂苛,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,664評(píng)論 18 399
  • 康德的哥白尼式革命 一、背景 柏拉圖主義傳統(tǒng):理念世界與經(jīng)驗(yàn)世界二分邢隧,理念的何以有效:流溢說(shuō)(最高的理念使低等的理...
    xenos_eleates閱讀 660評(píng)論 0 0