亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

Java虛擬機處理異常的最佳方式

2024-07-14 08:43:53
字體:
供稿:網(wǎng)友

前言

歡迎來到Under The Hood專欄。本專欄旨在讓Java開發(fā)人員一瞥在運行Java程序底層的神秘機制。本月的文章繼續(xù)討論Java虛擬機的字節(jié)碼指令集,方法是檢查Java虛擬機處理異常拋出和捕獲的方式,包括相關(guān)的字節(jié)碼。本文不討論finally條款 - 這是下個月的主題。后續(xù)文章將討論字節(jié)碼系列的其他成員。

下面話不多說了,來一起看看詳細的介紹吧

Exceptions

Exceptions允許您順利處理程序運行時發(fā)生的意外情況。要演示Java虛擬機處理異常的方式,請考慮一個名為NitPickyMath的類。它提供了對整數(shù)執(zhí)行加法,減法,乘法,除法和余數(shù)的方法。NitPickyMath在溢出,下溢和被零除的條件下拋出已檢查的異常。Java虛擬機將在整數(shù)除零上拋出一個ArithmeticException,但不會在溢出和下溢上拋出任何異常。方法拋出的異常定義如下:

class OverflowException extends Exception {}class UnderflowException extends Exception {}class DivideByZeroException extends Exception {}

捕獲和拋出異常的簡單方法是remainder類的方法NitPickyMath:

static int remainder(int dividend, int divisor) throws DivideByZeroException { try {  return dividend % divisor; } catch (ArithmeticException e) {  throw new DivideByZeroException(); }}

該remainder方法僅在傳遞兩個int參數(shù)時執(zhí)行余數(shù)運算。如果余數(shù)運算的除數(shù)為零,則余數(shù)運算拋出一個ArithmeticException。這個方法捕獲了這個ArithmeticException并拋出一個DivideByZeroException。

DivideByZeroException和ArithmeticException之間的差別是DivideByZeroException是一個檢查異常,并且ArithmeticException是未經(jīng)檢查。因為ArithmeticException是非受檢異常,所以方法不需要在throws子句中聲明此異常,即使它可能會拋出它。任何屬于Error或者RuntimeException子類的異常都是非受檢異常。(ArithmeticException是RuntimeException的子類。)通過捕獲ArithmeticException然后拋出DivideByZeroException,該remainder方法強制其客戶端處理除零異常的可能性,通過捕獲它或在自己的throws子句中聲明DivideByZeroException。這是因為已檢查的異常,例如DivideByZeroException,拋出方法必須由方法捕獲或在方法的throws子句中聲明。未經(jīng)檢查的異常(例如ArithmeticException,不需要在throws子句中捕獲或聲明)。

javac為該remainder方法生成以下字節(jié)碼序列:

The main bytecode sequence for remainder:
   0 iload_0               // Push local variable 0 (arg passed as divisor)
   1 iload_1               // Push local variable 1 (arg passed as dividend)
   2 irem                  // Pop divisor, pop dividend, push remainder
   3 ireturn               // Return int on top of stack (the remainder)
The bytecode sequence for the catch (ArithmeticException) clause:
   4 pop                   // Pop the reference to the ArithmeticException
                           // because it isn't used by this catch clause. 
   5 new #5 <Class DivideByZeroException>
                       // Create and push reference to new object of class
                      // DivideByZeroException.
DivideByZeroException
   8 dup           // Duplicate the reference to the new
                           // object on the top of the stack because it 
                           // must be both initialized 
                        // and thrown. The initialization will consume
                       // the copy of the reference created by the dup.
   9 invokenonvirtual #9 <Method DivideByZeroException.<init>()V>
                      // Call the constructor for the DivideByZeroException
                      // to initialize it. This instruction
                     // will pop the top reference to the object.
  12 athrow          // Pop the reference to a Throwable object, in this
                           // case the DivideByZeroException, 
                           // and throw the exception.

該remainder方法的字節(jié)碼序列有兩個獨立的部分。第一部分是該方法的正常執(zhí)行路徑。這部分從pc偏移0到3。第二部分是catch子句,它從pc偏移4到12。

主字節(jié)碼序列中的irem指令可能會拋出一個ArithmeticException。如果發(fā)生這種情況,Java虛擬機知道通過查找表中的異常來跳轉(zhuǎn)到實現(xiàn)catch子句的字節(jié)碼序列。捕獲異常的每個方法都與一個異常表相關(guān)聯(lián),該異常表在類文件中與方法的字節(jié)碼序列一起傳遞。每個try塊捕獲的每個異常在異常表中都有一個條目。每個條目都有四條信息:起點和終點,要跳轉(zhuǎn)到的字節(jié)碼序列中的pc偏移量,以及正被捕獲的異常類的常量池索引。remainder類的NitPickyMath方法的異常表如下所示:

Exception table:
   from   to  target type
     0     4     4   <Class java.lang.ArithmeticException>

上面的異常表指示從pc偏移0到3(包括0),表示ArithmeticException將被捕獲的范圍。在標簽“to”下面的表中列出的是try塊的端點值,它總是比捕獲異常的最后一個pc偏移量多一。在這種情況下,端點值列為4,捕獲到異常的最后一個pc偏移量為3。此范圍(包括0到3)對應于在remainder的try塊內(nèi)實現(xiàn)代碼的字節(jié)碼序列。如果ArithmeticException在pc偏移量為0和3之間(包括0和3)之間拋出,則表中列出的"to"就是跳轉(zhuǎn)到的pc偏移量。

如果在執(zhí)行方法期間拋出異常,Java虛擬機將在異常表中搜索匹配的條目。如果當前程序計數(shù)器在條目指定的范圍內(nèi),并且拋出的異常類是由條目指定的異常類(或者是指定異常類的子類),則異常表條目匹配。Java虛擬機按照條目在表中的顯示順序搜索異常表。找到第一個匹配項后,Java虛擬機會將程序計數(shù)器設(shè)置為新的pc偏移位置并繼續(xù)執(zhí)行。如果未找到匹配項,Java虛擬機將彈出當前堆棧幀并重新拋出相同的異常。當Java虛擬機彈出當前堆棧幀時,它有效地中止當前方法的執(zhí)行并返回調(diào)用此方法的方法。但是,不是在前一個方法中繼續(xù)正常執(zhí)行,而是在該方法中拋出相同的異常,這會導致Java虛擬機經(jīng)歷搜索該方法的異常表的相同過程。

Java程序員可以使用throw語句拋出異常,例如remainder中的一個子句catch(ArithmeticException),其中一個 DivideByZeroException創(chuàng)建并拋出。執(zhí)行拋出的字節(jié)碼如下表所示:

 

OPCODE OPERAND(S) DESCRIPTION
athrow (none) pops Throwable object reference, throws the exception

 

athrow指令從堆棧中彈出頂部字節(jié),并且會認為它是一個Throwable子類的引用(或Throwable本身)。拋出的異常是彈出對象引用定義的類型。

Play Ball!: a Java virtual machine simulation

下面的applet演示了一個執(zhí)行一系列字節(jié)碼的Java虛擬機。模擬中的字節(jié)碼序列由javac生成。

類的playBall方法如下所示:

class Ball extends Exception {}class Pitcher { private static Ball ball = new Ball(); static void playBall() {  int i = 0;  while (true) {   try {    if (i % 4 == 3) {     throw ball;    }    ++i;   }   catch (Ball b) {    i = 0;   }  } }}

javac為該playBall方法生成的字節(jié)碼如下所示:

0 iconst_0             // Push constant 0
   1 istore_0         // Pop into local var 0: int i = 0;
           // The try block starts here (see exception table, below).
   2 iload_0              // Push local var 0
   3 iconst_4             // Push constant 4
   4 irem                 // Calc remainder of top two operands
   5 iconst_3             // Push constant 3
   6 if_icmpne 13    // Jump if remainder not equal to 3: if (i % 4 == 3) {
                    // Push the static field at constant pool location #5,
                   // which is the Ball exception itching to be thrown
   9 getstatic #5 <Field Pitcher.ball LBall;>
  12 athrow        // Heave it home: throw ball;
  13 iinc 0 1       // Increment the int at local var 0 by 1: ++i;
                    // The try block ends here (see exception table, below).
  16 goto 2               // jump always back to 2: while (true) {}
                          // The following bytecodes implement the catch clause:
  19 pop              // Pop the exception reference because it is unused
  20 iconst_0             // Push constant 0
  21 istore_0             // Pop into local var 0: i = 0;
  22 goto 2            // Jump always back to 2: while (true) {}
Exception table:
   from   to  target type
     2    16    19   <Class Ball>
     ```

該playball方法永遠循環(huán)。每四次循環(huán),playball拋出Ball并抓住它,只是因為它很有趣。因為try塊和catch子句都在無限循環(huán)中,所以樂趣永遠不會停止。局部變量i從0開始,每次遞增遞增循環(huán)。當if語句出現(xiàn)true時,每次i等于3 時都會發(fā)生Ball異常,拋出異常。

Java虛擬機檢查異常表并發(fā)現(xiàn)確實存在適用的條目。條目的有效范圍是2到15(包括兩者),異常在pc偏移12處拋出。條目捕獲的異常是類Ball,拋出的異常是類Ball。鑒于這種完美匹配,Java虛擬機將拋出的異常對象推送到堆棧,并繼續(xù)在pc偏移19處執(zhí)行catch子句,這里僅將int i重置為0,并且循環(huán)重新開始。

要驅(qū)動模擬,只需按“步驟”按鈕。每次按下“Step”按鈕都會使Java虛擬機執(zhí)行一個字節(jié)碼指令。要開始模擬,請按“重置”按鈕。要使Java虛擬機重復執(zhí)行字節(jié)碼而不需要進一步操作,請按“運行”按鈕。然后,Java虛擬機將執(zhí)行字節(jié)碼,直到按下“停止”按鈕。applet底部的文本區(qū)域描述了要執(zhí)行的下一條指令。快樂點擊。

英文原文:https://www.javaworld.com/article/2076868/how-the-java-virtual-machine-handles-exceptions.html

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
视频精品一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 欧美日韩在线播放三区四区| 国产精品一区二区av影院萌芽| 亚洲a∨一区二区三区| 女同久久另类99精品国产| 4438亚洲最大| 欧美精彩一区二区三区| 老司机免费视频久久| 中文一区二区三区四区| 免费看av不卡| 丝袜美腿亚洲一区二区图片| 亚洲五码在线观看视频| 久久一区亚洲| 91精品在线观看国产| 国内精品久久久久久野外| 日韩精品一区二区三区四| 天天影视网天天综合色在线播放| 亚洲男同1069视频| 精品久久久久久国产| 黄在线观看在线播放720p| 一级黄色大片视频| 国产传媒av在线| 韩国日本一区二区三区| 男女18免费网站视频| 亚洲欧美日韩第一页| 亚洲国产二区| 新版的欧美在线视频| 精品精品国产国产自在线| 日韩激情精品| 中文字幕综合在线| 亚洲国产精品久久网午夜小说| 国产精品视频在线观看| 日韩国产精品久久久久久亚洲| 国产成年人视频网站| 国产一区二区自拍| www.亚洲| 一级毛片免费观看| 中文字幕在线看精品乱码| 国产高清自产拍av在线| 国产免费高清| 欧日韩一区二区三区| www.com亚洲| 99re6这里只有精品视频在线观看| 激情小说欧美色图| 日韩一区二区欧美| 丰满少妇乱子伦精品看片| 欧美高清不卡| 全部免费毛片在线播放一个| 国产成人av电影在线播放| 久久福利毛片| 欧美日韩激情一区二区三区| 91精品论坛| 欧美精品一二三区| 国产精品自拍网站| 欧美一级久久久久久久久大| 亚洲一区视频在线观看视频| 人人爽久久涩噜噜噜网站| 欧美一区二区三区四区在线观看| xxx在线视频| av一本久道久久波多野结衣| 蜜芽在线免费观看| 精品久久一二三| 日本伊人久久| 成人ssswww在线播放| 色综合久久88色综合天天6| 韩国v欧美v日本v亚洲| av最新在线| 国产主播喷水一区二区| 国产精品私人影院| 天堂久久久久久| 台湾亚洲精品一区二区tv| 日本成人黄色网| 精品人妻一区二区三区免费| 中文字幕在线播放日韩| 在线看中文字幕| 亚洲激情一二三区| 91精品国产91久久久久久| 欧美日韩国产一区精品一区| 日韩欧美你懂的| 制服丝袜网站| 激情成人开心网| 亚洲精品女人| 精品一区二区三区四区| 国产人妻精品久久久久野外| 欧美专区福利在线| 国产精品激情电影| 国产精品黑丝在线播放| 欧美久久亚洲| 色丁香久综合在线久综合在线观看| 97视频精彩视频在线观看| 久久国产直播| 亚洲av无码一区二区三区人| 一本色道久久88亚洲综合88| 日韩三级电影免费观看| 91蜜桃婷婷狠狠久久综合9色| 成人在线爆射| 国产日韩视频在线| 中文字幕男人天堂| 成人av在线网| 青青精品视频播放| 欧美日韩成人高清| 97精品国产91久久久久久| 26uuu久久噜噜噜噜| 亚洲欧美小视频| 欧美日韩视频第一区| 日韩视频在线你懂得| 成人三级av在线| 嫩模一区二区三区| 97se亚洲国产综合自在线不卡| 久久久久久久久久久97| 国产精品6699| 992tv在线观看免费进| 欧美jizzhd精品欧美巨大免费| 97一区二区三区| 国产乱xxⅹxx国语对白| 中文字幕日韩av| 日日av拍夜夜添久久免费| 美女在线观看视频一区二区| 欧美二区在线视频| 成人欧美在线| 国产日韩亚洲欧美综合| 我想看黄色大片| 婷婷丁香一区二区三区| 91偷拍精品一区二区三区| 黄色激情在线观看| 中文字幕一区二区三区av| 国内精品免费视频精选在线观看| 欧美成人一区二区三区片免费| 亚洲国产高清高潮精品美女| 亚洲同志男男gay1069网站| 欧美性bbb| 国产一区二区三区四区五区| 欧美亚洲自拍偷拍| 九九视频免费在线观看| 欧美一级高清片| av蓝导航精品导航| 国产精品一区二区av影院萌芽| 精品高清一区二区三区| 国产大学生粉嫩无套流白浆| 国产精品美女免费看| 精品一二线国产| 国产一区你懂的| www.成人.com| 亚洲女爱视频在线| 一本色道久久综合亚洲精品小说| 欧美xxxx在线观看| 色av成人天堂桃色av| 久久精品成人一区二区三区蜜臀| 色呦呦呦在线观看| 亚洲综合色在线| 亚洲精品一级二级| 中文字幕视频在线免费观看| 99国产在线播放| 久久精品一区| 久久亚洲国产精品尤物| 日韩男人天堂| www.8ⅹ8ⅹ羞羞漫画在线看| 疯狂欧美牲乱大交777| 国产伦精品一区二区三区视频小说| 亚洲一区电影777| 欧美亚洲免费| 亚洲精品亚洲人成人网在线播放| 性生活视频软件| 精品成人av一区二区在线播放| 中文字幕av片| 国产精品xxxav免费视频| 在线观看操人| 亚洲一区在线观看免费| 97影院理论片在线播放| 色系网站成人免费| 亚洲成年人电影网站| 亚洲无码久久久久久久| 中文字幕日本人妻久久久免费| 日韩欧美国产大片| 好吊色在线观看| 国产精品日韩av| 污视频在线播放| 国产成人精品www牛牛影视| 国产精品电影一区二区| 亚洲第一精品夜夜躁人人躁| 亚洲最新av在线网站| 欧美成人资源| 亚洲国产精品va在线观看黑人| 酒色婷婷桃色成人免费av网| 亚洲精品男人的天堂| 国产精品欧美大片| 亚洲国产综合在线看不卡| 精品中文字幕一区二区| 色哟哟亚洲精品| jizz免费视频| 99热成人精品热久久66| 国产乱在线观看视频| 美国一级片在线观看| 成人精品一区二区三区免费| 福利视频网址| 免费激情视频网站| 午夜dv内射一区二区| 亚洲av成人片无码| 欧美夫妻性生活xx| 国产成人1区| 国产精品女主播一区二区三区| а√天堂中文资源在线bt| 国产精品久久久久久久午夜片| 九九综合九九| 天堂√8在线中文| 中文字幕资源网在线观看免费| 日本少妇bbwbbw精品| 日韩成人综合| 精品一区二区免费| 国产成+人+综合+亚洲欧美丁香花| 国产一区二区在线视频| 在线免费观看一区二区三区| 中文字幕av一区中文字幕天堂| 国产91综合网| 国产美女主播在线| 91国偷自产一区二区使用方法| 中文字幕免费在线观看视频一区| 亚洲一区二区免费在线观看| 国产在线视频福利| 91精品免费| 中文字幕在线看人| 九色91播放| 免费99精品国产自在在线| 国产免费高清一区| 精品一区在线看| 四虎精品成人免费网站| 91精品国产一区二区三区动漫| 国产偷倩在线播放| 天天色天天综合网| 日本在线观看一区| 麻豆免费精品视频| sihu影院永久在线影院| 国产精品日日摸夜夜摸av| 久久免费影院| 玖玖玖电影综合影院| 国产精品日本一区二区不卡视频| 亚洲无码精品在线观看| 免费久久99精品国产自| 韩国三级视频在线观看| 中文一区一区三区高中清不卡| 97在线观看免费观看| 超碰在线12| 中文字幕欧美激情| 成本人h片动漫网站在线观看| 亚洲综合色婷婷| 俄罗斯一级**毛片在线播放| 黄色a在线观看| 日韩欧美一起| 免费观看国产视频| jlzzjizz在线播放观看| 精品成人av一区| 欧美专区在线| 日本美女久久久| 美女网站色91| 尤物视频最新网址| 26uuu另类亚洲欧美日本一| 成人在线视频亚洲| xxav国产精品美女主播| 国产一区二区三区在线观看视频| 国产亚洲精品福利| 在线播放精品视频| 中出一区二区| 国产清纯美女被跳蛋高潮一区二区久久w| 国产激情片在线观看| 成人免费观看a| 伊人久久大香线蕉综合网蜜芽| 六月丁香在线视频| 欧美日韩一区二区三区高清| 亚洲天堂视频在线| 亚洲大片一区二区三区| 亚洲欧洲日本mm| av天在线观看| 尤物yw午夜国产精品视频明星| 亚洲人成影院在线| 国产精品网站入口| 色婷婷精品大视频在线蜜桃视频| 亚洲人成影院77777| 国产河南妇女毛片精品久久久| 在线视频免费观看一区| 亚洲国产福利视频| 欧美网站大全在线观看| 中文字幕+乱码+中文字幕一区| 久久97久久97精品免视看秋霞| 午夜精品久久久久久久久久久| 四虎影视1304t| 国产片在线观看| 国产黄色精品网站| 亚洲熟妇av一区二区三区漫画| 日韩一二三区不卡| 中老年在线免费视频| 337人体粉嫩噜噜噜| 亚洲女成人图区| 欧美高清另类hdvideosexjaⅴ| 美女毛片在线看| www在线播放| 日本精品免费视频| 51精品国自产在线| 日韩制服丝袜先锋影音| 成av人片一区二区| 亚洲日本青草视频在线怡红院| 欧美三级自拍| 欧美视频网站| 亚洲人在线观看| 日韩精品午夜| cao在线观看| 欧美大片免费久久精品三p| 国产一区你懂的| 美女呻吟一区| 性高潮免费视频| 精品国产三级| 国产乱子伦一区二区三区国色天香| 高清色视频在线观看| 黄色毛片av| 亚洲男人天堂色| 永久免费精品影视网站| 激情六月天婷婷| 欧美日韩美女在线| 91精品在线免费观看| 国产成人无码一区二区在线播放| 欧洲在线一区| 精品国产乱码久久久久久1区二区| 亚洲欧美日韩直播| 一区二区三区在线影院| 男女激情视频网站| 久久久久无码精品国产| 国产一级理论片| 国产精品一国产精品最新章节|