色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java的異常原理

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-11 15:42 ? 次閱讀

引子

首先,小編聲明一下,這里講的Exception不僅僅是Exception一個(gè)類,而是異常機(jī)制,就像下面圖中的所有(含繼承Error和Exception的)。

圖片
異常類圖

當(dāng)然JDK中更為細(xì)致的異常繼承體系也不是本篇探討內(nèi)容,本次呢,指北君將對(duì)異常在JVM層面的執(zhí)行原理和ARM進(jìn)行介紹,這里ARM也不是芯片架構(gòu),而是指自動(dòng)資源管理。

異常表

要想了解異常執(zhí)行原理,異常表是一個(gè)最佳的入口,異常表是什么?我來看看下面的數(shù)據(jù)結(jié)構(gòu)描述:

exception_table {
    u2 start_pc;
    u2 end_pc;
    u2 handler_pc;
    u2 catch_type;
}

它是虛擬機(jī)中用于表述異常處理的一種數(shù)據(jù)結(jié)構(gòu),我再來看異常表的樣例,下面是一段包含try-catch代碼編譯后的字節(jié)碼中的內(nèi)容:

from    to  target type
            8    41    41   Class java/lang/IllegalArgumentException
            8    41    41   Class java/io/IOException
            8    53    63   any

邏輯上的表述可以用下圖表示:

圖片

異常類圖

  1. 監(jiān)測(cè)從8-41(41不包含)號(hào)指令的IllegalArgumentException
  2. 監(jiān)測(cè)從8-41指令的IOException
  3. 監(jiān)測(cè)從8到53指令的結(jié)束動(dòng)作,包含三種情況:跳出指令(比如return指令集);athrow指令且沒有匹配的異常類型;指令執(zhí)行到最后一條
  4. 如果監(jiān)測(cè)到指定動(dòng)作,則按照異常表進(jìn)行跳轉(zhuǎn)

現(xiàn)在,回到異常表,我們可以看到異常表包含多條異常處理數(shù)據(jù),每條數(shù)據(jù)包含四個(gè)屬性

  • from 監(jiān)控的指令集起始編號(hào)
  • to 監(jiān)控的指令集結(jié)束編號(hào)
  • target 滿足條件后指令跳轉(zhuǎn)目標(biāo)
  • 異常匹配的類型,特殊類型any,對(duì)應(yīng)fanally塊,監(jiān)控try塊和catch塊

對(duì)于return,athrow等指令,執(zhí)行順序需要注意,指令是在對(duì)應(yīng)的處理之后執(zhí)行。

可能會(huì)讓你意識(shí)混亂的例子:

public String execOrder(int sn) {
        StringBuilder build = new StringBuilder();
        try {
            build.append("try-block");
            if(sn == 0) {
                return build.append(", end").toString();
            }
        }catch(RuntimeException e) {
            build.append(", catch-block");
        }finally{
            build.append(", finally-block");
        }
        
        return build.toString();
    }

我們之前說過finally塊會(huì)在return之前執(zhí)行,那是不是執(zhí)行結(jié)果是:try->finally->end這種順序呢?實(shí)際的執(zhí)行的結(jié)果是:try-block,end。可以看到,finally塊沒有對(duì)結(jié)果形成影響,當(dāng)然,這并不說它沒執(zhí)行,只是reutrn的結(jié)果在執(zhí)行finally塊時(shí)已經(jīng)計(jì)算出結(jié)果了,在執(zhí)行完finally塊后將之前計(jì)算的結(jié)果返回了而已。所以我們要深入理解了執(zhí)行的原理,才能正確理解結(jié)果。

ARM 自動(dòng)資源管理

講完前面的異常執(zhí)行原理后,指北君現(xiàn)在給大家介紹異常機(jī)制在JDK1.7中一個(gè)優(yōu)化特性:自動(dòng)資源管理。經(jīng)常使用IO的小伙伴一定對(duì)關(guān)閉IO很煩,寫法繁瑣,關(guān)閉前還要做判斷,并且在關(guān)閉塊代碼還要加try-catch,就如同下面類似的代碼:

InputStreamReader in = null;
        OutputStreamWriter out = null;
        try {
            in = new InputStreamReader(new FileInputStream(""));
        }catch(IOException e) {
            
        }finally {
            try {
                if(in != null) {
                    in.close();
                }
                if(out != null) {
                    in.close();
                }
            }catch(IOException e) {
                
            }
        }

反正指北君每次寫這種代碼的時(shí)候很煩,就是那種啥事沒干,占我一塊黃金代碼位置的感覺,對(duì)于有精簡代碼癖好的人來說,就像吃了一口蒼蠅般難受。有了ARM后,我們?cè)賮砜纯葱碌膶懛ǎ?/p>

public void sample2() {
        try (InputStreamReader in  = new InputStreamReader(new FileInputStream(""))){
            in.read();
        }catch(IOException e) {
            
        }finally {
            
        }
    }

是不是簡潔多了,資源直接在try后的括號(hào)內(nèi)進(jìn)行聲明,而且不需要顯式的關(guān)閉流的代碼,這難道就是ARM!是不是有點(diǎn)小興奮!對(duì)于ARM自動(dòng)資源管理要點(diǎn)如下:

  • 在try后的括號(hào)內(nèi)聲明需要自動(dòng)關(guān)閉的資源
  • 資源必須實(shí)現(xiàn)一個(gè)關(guān)鍵接口:AutoCloseable。在滿足上面的條件后,JDK將為我們自動(dòng)關(guān)閉資源。當(dāng)然這種寫法即使想手動(dòng)關(guān)閉,在catch和finally部分也拿不到資源引用。

又到了追根溯源環(huán)節(jié)了,自動(dòng)資源管理是如何實(shí)現(xiàn)的呢?先看看class文件有啥變化。

21: aload_3
22: invokevirtual #112                // Method java/io/InputStreamReader.read:()I
25: pop
26: ldc           #51                 // String try-block
28: astore        4
30: aload_3
31: ifnull        94
34: aload_3
35: invokevirtual #103                // Method java/io/InputStreamReader.close:()V
38: goto          94
41: astore_1
42: aload_3
43: ifnull        50
46: aload_3
47: invokevirtual #103                // Method java/io/InputStreamReader.close:()V
50: aload_1
51: athrow
52: astore_2

對(duì)比之前的字節(jié)碼文件,我們明顯發(fā)現(xiàn)雖然代碼行數(shù)少了,但是Class編譯后的內(nèi)容一點(diǎn)都沒少,而且異常表中除了finally對(duì)應(yīng)的處理,還增加了額外的部分。具體幾個(gè)不同點(diǎn):

  1. 字節(jié)碼中竟然有close調(diào)用
  2. 異常表中增加了內(nèi)容
Exception table:
    from    to  target type
       21    30    41   any
        4    52    52   any
        0    74    74   Class java/io/IOException
        0    78    85   any

好奇怪的異常表,我們查看指令,可以明顯找出最后一條是對(duì)應(yīng)finally處理。前面的呢?經(jīng)過分析我們發(fā)現(xiàn)前面是finally形式的關(guān)閉資源。看到這里,結(jié)果就很明顯了,自動(dòng)資源管理實(shí)際是上編譯幫助我們做了顯示關(guān)閉的邏輯,在JVM執(zhí)行層面沒有增加新的功能。簡而言之,自動(dòng)資源管理是編譯器層面的改進(jìn),通過擴(kuò)展語法和增強(qiáng)編譯能力(增加自動(dòng)的資源關(guān)閉能力)來實(shí)現(xiàn)自動(dòng)化編碼。

總結(jié)

關(guān)于Java的異常的原理,以及自動(dòng)資源管理的用法和實(shí)現(xiàn)方式,就給大家介紹到這里。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    456

    文章

    51154

    瀏覽量

    426268
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2974

    瀏覽量

    104973
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4823

    瀏覽量

    68899
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    661

    瀏覽量

    32974
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    12252
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    InfiniiVision DSO6104L上的遠(yuǎn)程Web訪問java異常錯(cuò)誤

    Oscope。當(dāng)我最初嘗試啟動(dòng)遠(yuǎn)程面板命令時(shí),我得到一個(gè)java異常錯(cuò)誤。我將瀏覽器安全性設(shè)置為最低級(jí)別并啟用了java腳本,并使用范圍ip地址授予了網(wǎng)頁訪問權(quán)限。我在Explorer,Chrome
    發(fā)表于 10-11 11:44

    請(qǐng)問Java異常錯(cuò)誤該怎么辦?

    在成功構(gòu)建之后,我繼續(xù)進(jìn)行Flash,但得到Java異常錯(cuò)誤(見下文)。Matlab版本R2014BMICROMPLATS 3.37 MPLAB X IDE V3.26XC16
    發(fā)表于 10-14 11:19

    MPLABX IDE 3.40和3.45 Win 7編輯器Java異常該怎么辦?

    剛剛安裝了MPLAB X IDE 3.40,并有文本編輯器的問題。如果我嘗試打開任何源文件,我會(huì)得到下面的Java異常java. Lang.CassCasExtExc
    發(fā)表于 10-28 09:45

    如何處理MHC V1.0.7.9java異常

    ]***生成配置***[Info][Info]生成項(xiàng)目ba生成文件。[Error]Generate由于未處理的異常而失敗。[Error]Exception堆棧跟蹤:[Error
    發(fā)表于 05-13 11:02

    Java異常體系級(jí)處理辦法

      一、異常簡介  優(yōu)秀的程序代碼,都在追求高效,安全,和低錯(cuò)誤率,但是程序中的異常是無法避免的,降低異常出現(xiàn)的頻率是關(guān)鍵,異常出現(xiàn)如何處理是另一個(gè)重要方面,
    發(fā)表于 01-05 17:48

    Java異常處理及其應(yīng)用

    Java異常處理引出 假設(shè)您要編寫一個(gè) Java 程序,該程序讀入用戶輸入的一行文本,并在終端顯示該文本。 程序如下: 1 import java.io.*;2 public c
    發(fā)表于 11-09 12:03 ?15次下載

    Java異常處理PPT課件

    Java 異常處理: 什么情況下使用例外機(jī)制? n當(dāng)方法因?yàn)樽陨頍o法控制的原因而不能完成其任務(wù) n文件不存在,網(wǎng)絡(luò)連接無法建立 n處理在方法、類庫、類中拋出的例外 n如FileInputStream.re
    發(fā)表于 08-19 17:12 ?44次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>處理PPT課件

    Java異常處理之try,catch,finally,throw,throws

    ,程序繼續(xù)運(yùn)行。 java異常處理是通過5個(gè)關(guān)鍵字來實(shí)現(xiàn)的:try、catch、finally、throw、throws。 二:java異常類的層次結(jié)構(gòu) 三。常見的
    發(fā)表于 09-27 11:17 ?0次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>處理之try,catch,finally,throw,throws

    java異常處理的設(shè)計(jì)與重構(gòu)

    尋找出錯(cuò)的根源?但是如果一個(gè)項(xiàng)目異常處理設(shè)計(jì)地過多,又會(huì)嚴(yán)重影響到代碼質(zhì)量以及程序的性能。因此,如何高效簡潔地設(shè)計(jì)異常處理是一門藝術(shù),本文下面先講述Java異常機(jī)制最基礎(chǔ)的知識(shí),然后給
    發(fā)表于 09-27 15:40 ?1次下載
    <b class='flag-5'>java</b><b class='flag-5'>異常</b>處理的設(shè)計(jì)與重構(gòu)

    java異常處理設(shè)計(jì)和一些建議

    出錯(cuò)從哪里尋找出錯(cuò)的根源?但是如果一個(gè)項(xiàng)目異常處理設(shè)計(jì)地過多,又會(huì)嚴(yán)重影響到代碼質(zhì)量以及程序的性能。因此,如何高效簡潔地設(shè)計(jì)異常處理是一門藝術(shù),本文下面先講述Java異常機(jī)制最基礎(chǔ)的知
    發(fā)表于 09-28 11:48 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>異常</b>處理設(shè)計(jì)和一些建議

    Java異常選擇和使用的誤區(qū)和經(jīng)驗(yàn)總結(jié)

    本文著重介紹了 Java 異常選擇和使用中的一些誤區(qū),希望各位讀者能夠熟練掌握異常處理的一些注意點(diǎn)和原則,注意總結(jié)和歸納。只有處理好了異常,才能提升開發(fā)人員的基本素養(yǎng),提高系統(tǒng)的健壯性
    發(fā)表于 11-27 08:54 ?1390次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>選擇和使用的誤區(qū)和經(jīng)驗(yàn)總結(jié)

    對(duì)處理 Java 異常三原則的詳細(xì)分析

    Java異常提供了一種識(shí)別及響應(yīng)錯(cuò)誤情況的一致性機(jī)制,有效地異常處理能使程序更加健壯、易于調(diào)試。
    的頭像 發(fā)表于 12-25 11:09 ?3756次閱讀
    對(duì)處理 <b class='flag-5'>Java</b> <b class='flag-5'>異常</b>三原則的詳細(xì)分析

    java教程之如何進(jìn)行Java異常處理?

    本文檔的主要內(nèi)容詳細(xì)介紹的是java教程之如何進(jìn)行Java異常處理?
    發(fā)表于 09-28 17:16 ?0次下載

    Java教程之零點(diǎn)起飛學(xué)Java異常處理資料說明

    Java語言提供了異常機(jī)制來處理程序運(yùn)行過程中可能發(fā)生的各種非正常事件。通過異常處理機(jī)制,大大提高了程序的健壯性。Java語言對(duì)各種異常進(jìn)行
    發(fā)表于 02-20 10:41 ?11次下載
    <b class='flag-5'>Java</b>教程之零點(diǎn)起飛學(xué)<b class='flag-5'>Java</b>的<b class='flag-5'>異常</b>處理資料說明

    Java異常的習(xí)題和代碼分析

    Java異常的習(xí)題和代碼分析
    發(fā)表于 07-08 14:54 ?5次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>的習(xí)題和代碼分析
    主站蜘蛛池模板: 六级黄色片 | 日本美女毛茸茸 | 欧美一区二区三区久久综 | 国产精品久久久久久久久久久 | 又硬又粗又大一区二区三区视频 | 快播看黄片 | 欧美日韩亚洲综合2019 | 娇妻在床上迎合男人 | 国产69精品久久久久乱码免费 | 91极品蜜桃臀在线播放 | 被两根巨大同时进去高H | 国产亚洲精品久久久闺蜜 | 99国产精品久久人妻无码 | 三级黄色在线视频 | 国产亚洲人成网站在线观看播放 | 在线亚洲精品国产一区麻豆 | 一本二卡三卡四卡乱码麻豆 | 国产高清国内精品福利色噜噜 | 四虎精品久久 | 高清国产mv视频在线观看 | 亚洲国产在线视频中文字 | 国产三级在线观看免费 | 精品国产影院 | 精品国产乱码久久久久久免费 | 亚洲精品喷白浆在线观看 | 国产精品人妻一区免费看8C0M | 骚浪插深些好烫喷了 | 69久久国产精品热88人妻 | 99re在这里只有精品 | 国产精品久久久久a影院 | 992交通广播| 久久视热频国产这里只有精品23 | 国产精品久久人妻无码网站一区无 | 无码人妻少妇色欲AV一区二区 | 国产欧美日韩亚洲第一页 | 99视频免费在线观看 | 精品国产乱码久久久人妻 | 东京热一本无码av | 年轻漂亮的妺妺中文字幕版 | 亚洲精品AV一区午夜福利 | 国产一区日韩二区欧美三区 |