通過字節(jié)碼分析Java異常處理機(jī)制

1.異常機(jī)制

Unchecked Exception

上面的異常繼承體系中多柑,Error和RuntimeException是非檢查型異常(Unchecked Exception),也就是不需要catch語句去捕獲的異常安皱;其他異常,則需要程序員手動(dòng)去處理。
接下來讓我們通過字節(jié)碼去一探究竟這種異常處理。

2.異常表

我們先來看一個(gè)實(shí)例

package sandwich.test5;

/**
 * @author 公眾號(hào):IT三明治
 * @date 2021/6/13
 */
public class SynchronizedTest {
    synchronized void fun1(){
        System.out.println("fun1");
    }
    static synchronized void fun2(){
        System.out.println("fun2");
    }
    final Object lock=new Object();

    void lockProcess(){
        synchronized (lock){
            System.out.println("lock");
        }
    }
}

反編譯得到lockProcess的信息

lockProcess方法反編譯

在synchronized生成的字節(jié)碼中临谱,其實(shí)包含兩條monitorexit指令,是為了保證所有的異常條件奴璃,都能夠退出悉默。
編譯后的字節(jié)碼,有一個(gè)叫Exception table的異常表苟穆,里面的每一行數(shù)據(jù)抄课,都是一個(gè)異常處理器。
from: 指定字節(jié)碼索引的開始位置
to: 指定字節(jié)碼索引的結(jié)束位置
target: 異常處理的起始位置
type:異常類型
也就是說雳旅,只要在from和to之間發(fā)生了異常跟磨,就會(huì)跳到target所指定的位置。
第一條monitorexit(16)在異常表第一條的范圍中攒盈,如果異常抵拘, 能夠跳到第20行。
第二條monitorexit(22)在異常表第二條的范圍中沦童,如果異常仑濒,能夠跳轉(zhuǎn)到第20行。
由以上java代碼可以看到偷遗,我們不需要主動(dòng)去catch exception. 也能自動(dòng)處理兩個(gè)any類型的異常
如果用jclasslib插件觀察墩瞳,也很方便。

3. Finally

通常我們?cè)谧鲆恍┪募x取的時(shí)候氏豌,都會(huì)在finally代碼塊中關(guān)閉流喉酌,以避免內(nèi)存的溢出。關(guān)于這個(gè)場(chǎng)景泵喘,我們?cè)俜治鲆幌孪旅孢@段代碼的異常表泪电。

package sandwich.test5;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author 公眾號(hào):IT三明治
 * @date 2021/6/13
 */
public class StreamTest {
    public void read() {
        InputStream in = null;
        try {
            in = new FileInputStream("Test.java");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上面的代碼,捕獲了一個(gè)FileNotFoundException異常纪铺,然后在finally中捕獲了IOException異常相速。當(dāng)我們分析字節(jié)碼的時(shí)候,卻發(fā)現(xiàn)了一個(gè)有意思的地 方:IOException足足出現(xiàn)了三次

finally異常處理過程

Java編譯器使用了一種比較傻的方式來組織finally的字節(jié)碼鲜锚,它分別在try突诬、catch的正常執(zhí)行路徑上,復(fù)制一份finally代碼芜繁,追加在正常執(zhí)行邏輯的后面旺隙。同時(shí),再?gòu)?fù)制一份到其他異常執(zhí)行邏輯的出口處骏令。
再看一個(gè)例子

package sandwich.test5;

/**
 * @author 公眾號(hào):IT三明治
 * @date 2021/6/13
 */
public class NoError {
    public static void main(String[] args) {
        NoError noError = new NoError();
        int result = noError.read();
        System.out.println(result);
    }

    private int read() {
        try {
            int a = 13/0;
            return a;
        } finally {
            return 1;
        }
    }
}

這段代碼不報(bào)錯(cuò)的原因蔬捷,都可以在字節(jié)碼中找到答案


通過程序的字節(jié)碼,可以看到榔袋,異常之后周拐,直接跳轉(zhuǎn)到序號(hào)9了。沒有輸出錯(cuò)誤的字節(jié)碼摘昌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末速妖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子聪黎,更是在濱河造成了極大的恐慌罕容,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稿饰,死亡現(xiàn)場(chǎng)離奇詭異锦秒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喉镰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門旅择,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侣姆,你說我怎么就攤上這事生真〕霖” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵柱蟀,是天一觀的道長(zhǎng)川蒙。 經(jīng)常有香客問我,道長(zhǎng)长已,這世上最難降的妖魔是什么畜眨? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮术瓮,結(jié)果婚禮上康聂,老公的妹妹穿的比我還像新娘。我一直安慰自己胞四,他們只是感情好恬汁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辜伟,像睡著了一般蕊连。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上游昼,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天甘苍,我揣著相機(jī)與錄音,去河邊找鬼烘豌。 笑死载庭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的廊佩。 我是一名探鬼主播囚聚,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼标锄!你這毒婦竟也來了顽铸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤料皇,失蹤者是張志新(化名)和其女友劉穎谓松,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體践剂,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鬼譬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逊脯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片优质。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巩螃,到底是詐尸還是另有隱情演怎,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布避乏,位于F島的核電站颤枪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淑际。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一扇住、第九天 我趴在偏房一處隱蔽的房頂上張望春缕。 院中可真熱鬧,春花似錦艘蹋、人聲如沸锄贼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宅荤。三九已至,卻和暖如春浸策,著一層夾襖步出監(jiān)牢的瞬間冯键,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工庸汗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惫确,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓蚯舱,卻偏偏與公主長(zhǎng)得像改化,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枉昏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 異常是日常開發(fā)中大家都「敬而遠(yuǎn)之」的一個(gè)東西陈肛,但實(shí)際上幾乎每種高級(jí)程序設(shè)計(jì)語言都有自己的異常處理機(jī)制,因?yàn)闊o論你是...
    Single_YAM閱讀 375評(píng)論 0 1
  • 2.JAVA異常 異常指不期而至的各種狀況兄裂,如:文件找不到句旱、網(wǎng)絡(luò)連接失敗、非法參數(shù)等晰奖。異常是一個(gè)事件前翎,它發(fā)生在程...
    青城樓主閱讀 551評(píng)論 0 0
  • 概念介紹 異常是發(fā)生在程序執(zhí)行過程中阻礙程序正常執(zhí)行的錯(cuò)誤事件,當(dāng)一個(gè)程序出現(xiàn)錯(cuò)誤時(shí)畅涂,可能的情況有如下3種: 語法...
    niaoge2016閱讀 5,170評(píng)論 2 20
  • 什么是異常港华? 異常本質(zhì)上是程序上的錯(cuò)誤,錯(cuò)誤在我們編寫程序的過程中會(huì)經(jīng)常發(fā)生午衰,包括編譯期間和運(yùn)行期間的錯(cuò)誤立宜。 編譯...
    若兮緣閱讀 3,338評(píng)論 0 11
  • 本文部分來自于:代碼鋼琴家blog address:www.cnblogs.com/lulipro/p/75042...
    八目朱勇銘閱讀 1,315評(píng)論 0 4