在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java的異常原理

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

引子

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

圖片
異常類圖

當然JDK中更為細致的異常繼承體系也不是本篇探討內容,本次呢,指北君將對異常在JVM層面的執行原理和ARM進行介紹,這里ARM也不是芯片架構,而是指自動資源管理。

異常表

要想了解異常執行原理,異常表是一個最佳的入口,異常表是什么?我來看看下面的數據結構描述:

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

它是虛擬機中用于表述異常處理的一種數據結構,我再來看異常表的樣例,下面是一段包含try-catch代碼編譯后的字節碼中的內容:

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

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

圖片

異常類圖

  1. 監測從8-41(41不包含)號指令的IllegalArgumentException
  2. 監測從8-41指令的IOException
  3. 監測從8到53指令的結束動作,包含三種情況:跳出指令(比如return指令集);athrow指令且沒有匹配的異常類型;指令執行到最后一條
  4. 如果監測到指定動作,則按照異常表進行跳轉

現在,回到異常表,我們可以看到異常表包含多條異常處理數據,每條數據包含四個屬性

  • from 監控的指令集起始編號
  • to 監控的指令集結束編號
  • target 滿足條件后指令跳轉目標
  • 異常匹配的類型,特殊類型any,對應fanally塊,監控try塊和catch塊

對于return,athrow等指令,執行順序需要注意,指令是在對應的處理之后執行。

可能會讓你意識混亂的例子:

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塊會在return之前執行,那是不是執行結果是:try->finally->end這種順序呢?實際的執行的結果是:try-block,end??梢钥吹剑琭inally塊沒有對結果形成影響,當然,這并不說它沒執行,只是reutrn的結果在執行finally塊時已經計算出結果了,在執行完finally塊后將之前計算的結果返回了而已。所以我們要深入理解了執行的原理,才能正確理解結果。

ARM 自動資源管理

講完前面的異常執行原理后,指北君現在給大家介紹異常機制在JDK1.7中一個優化特性:自動資源管理。經常使用IO的小伙伴一定對關閉IO很煩,寫法繁瑣,關閉前還要做判斷,并且在關閉塊代碼還要加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) {
                
            }
        }

反正指北君每次寫這種代碼的時候很煩,就是那種啥事沒干,占我一塊黃金代碼位置的感覺,對于有精簡代碼癖好的人來說,就像吃了一口蒼蠅般難受。有了ARM后,我們再來看看新的寫法:

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

是不是簡潔多了,資源直接在try后的括號內進行聲明,而且不需要顯式的關閉流的代碼,這難道就是ARM!是不是有點小興奮!對于ARM自動資源管理要點如下:

  • 在try后的括號內聲明需要自動關閉的資源
  • 資源必須實現一個關鍵接口:AutoCloseable。在滿足上面的條件后,JDK將為我們自動關閉資源。當然這種寫法即使想手動關閉,在catch和finally部分也拿不到資源引用。

又到了追根溯源環節了,自動資源管理是如何實現的呢?先看看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

對比之前的字節碼文件,我們明顯發現雖然代碼行數少了,但是Class編譯后的內容一點都沒少,而且異常表中除了finally對應的處理,還增加了額外的部分。具體幾個不同點:

  1. 字節碼中竟然有close調用
  2. 異常表中增加了內容
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

好奇怪的異常表,我們查看指令,可以明顯找出最后一條是對應finally處理。前面的呢?經過分析我們發現前面是finally形式的關閉資源??吹竭@里,結果就很明顯了,自動資源管理實際是上編譯幫助我們做了顯示關閉的邏輯,在JVM執行層面沒有增加新的功能。簡而言之,自動資源管理是編譯器層面的改進,通過擴展語法和增強編譯能力(增加自動的資源關閉能力)來實現自動化編碼。

總結

關于Java的異常的原理,以及自動資源管理的用法和實現方式,就給大家介紹到這里。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    456

    文章

    51192

    瀏覽量

    427314
  • JAVA
    +關注

    關注

    19

    文章

    2975

    瀏覽量

    105156
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69058
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33046
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12261
收藏 人收藏

    評論

    相關推薦

    InfiniiVision DSO6104L上的遠程Web訪問java異常錯誤

    Oscope。當我最初嘗試啟動遠程面板命令時,我得到一個java異常錯誤。我將瀏覽器安全性設置為最低級別并啟用了java腳本,并使用范圍ip地址授予了網頁訪問權限。我在Explorer,Chrome
    發表于 10-11 11:44

    請問Java異常錯誤該怎么辦?

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

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

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

    如何處理MHC V1.0.7.9java異常

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

    Java異常體系級處理辦法

      一、異常簡介  優秀的程序代碼,都在追求高效,安全,和低錯誤率,但是程序中的異常是無法避免的,降低異常出現的頻率是關鍵,異常出現如何處理是另一個重要方面,
    發表于 01-05 17:48

    Java異常處理及其應用

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

    Java異常處理PPT課件

    Java 異常處理: 什么情況下使用例外機制? n當方法因為自身無法控制的原因而不能完成其任務 n文件不存在,網絡連接無法建立 n處理在方法、類庫、類中拋出的例外 n如FileInputStream.re
    發表于 08-19 17:12 ?44次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>處理PPT課件

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

    ,程序繼續運行。 java異常處理是通過5個關鍵字來實現的:try、catch、finally、throw、throws。 二:java異常類的層次結構 三。常見的
    發表于 09-27 11:17 ?0次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>處理之try,catch,finally,throw,throws

    java異常處理的設計與重構

    尋找出錯的根源?但是如果一個項目異常處理設計地過多,又會嚴重影響到代碼質量以及程序的性能。因此,如何高效簡潔地設計異常處理是一門藝術,本文下面先講述Java異常機制最基礎的知識,然后給
    發表于 09-27 15:40 ?1次下載
    <b class='flag-5'>java</b><b class='flag-5'>異常</b>處理的設計與重構

    java異常處理設計和一些建議

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

    Java異常選擇和使用的誤區和經驗總結

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

    對處理 Java 異常三原則的詳細分析

    Java異常提供了一種識別及響應錯誤情況的一致性機制,有效地異常處理能使程序更加健壯、易于調試。
    的頭像 發表于 12-25 11:09 ?3762次閱讀
    對處理 <b class='flag-5'>Java</b> <b class='flag-5'>異常</b>三原則的詳細分析

    java教程之如何進行Java異常處理?

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

    Java教程之零點起飛學Java異常處理資料說明

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

    Java異常的習題和代碼分析

    Java異常的習題和代碼分析
    發表于 07-08 14:54 ?5次下載
    <b class='flag-5'>Java</b><b class='flag-5'>異常</b>的習題和代碼分析
    主站蜘蛛池模板: 天天色成人 | 日产精品卡二卡三卡四卡乱码视频 | 2021久久精品99精品久久 | 天天狠天天天天透在线 | 女性私密部位扒开的视频 | 久久久婷婷亚洲5月97色 | 在线视频网址免费播放 | 黄色在线播放网站 | 欧美亚洲啪啪 | 欧美爽爽网 | 黄色网址免费在线 | 视频1区| 欧美成网 | 精品色图 | free 欧美| 中文字幕亚洲一区婷婷 | 免费一级欧美片在线观免看 | 我想看三级特黄 | 国模张文静啪啪私拍337p | 俺也来国产精品欧美在线观看 | 中国胖女人一级毛片aaaaa | 婷婷成人丁香五月综合激情 | 高h细节肉爽文bl文 高h细节肉爽文男男 | 四虎影酷 | 成年网站在线看 | 大美女久久久久久j久久 | 狠狠噜天天噜日日噜 | 视频一区 在线 | 午夜看片影院在线观看 | 欧美成人xxxx | 狠狠色综合网站久久久久久久 | 在线欧美色图 | 年轻护士3的滋味 | 久久三级国产 | 国产精品a在线观看香蕉 | 国产呦在线观看视频 | 日本经典在线三级视频 | 亚洲狠狠综合久久 | 狠狠鲁狠狠操 | 亚洲色图在线观看视频 | 久久久久国产 |