真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用JVM捕獲Java異常的方法

這篇文章主要介紹了使用JVM捕獲Java異常的方法,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

二連浩特網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,二連浩特網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為二連浩特上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的二連浩特做網(wǎng)站的公司定做!

1.異常的兩大關(guān)鍵因素

(1)拋出異常
1.顯式:應(yīng)用程序手動拋出異常。具體就是使用throw拋出異常
2.隱式:Java虛擬機對于無法執(zhí)行的代碼,自動拋出異常

(推薦:Java教程)

(2)捕獲異常
1.try 代碼塊:用來標(biāo)記需要進(jìn)行異常監(jiān)控的代碼。
2.catch 代碼塊:跟在 try 代碼塊之后,用來捕獲在 try 代碼塊中觸發(fā)的某種指定類型的異常。除了聲明所捕獲異常的類型之外,catch 代碼塊還定義了針對該異常類型的異常處理器。在 Java中,try 代碼塊后面可以跟著多個 catch 代碼塊,來捕獲不同類型的異常。Java 虛擬機會從上至下匹配異常處理器。因此,前面的 catch 代碼塊所捕獲的異常類型不能覆蓋后邊的,否則編譯器會報錯。
3.fnally 代碼塊:跟在 try 代碼塊和 catch 代碼塊之后,用來聲明一段必定運行的代碼。它的設(shè)計初衷是為了避免跳過某些關(guān)鍵的清理代碼,例如關(guān)閉已打開的系統(tǒng)資源。在程序正常執(zhí)行的情況下,這段代碼會在 try 代碼塊之后運行。否則,也就是 try 代碼塊觸發(fā)異常的情況下,如果該異常沒有被捕獲,fnally 代碼塊會直接運行,并且在運行之后重新拋出該異常。如果該異常被 catch 代碼塊捕獲,fnally 代碼塊則在 catch 代碼塊之后運行。在某些不幸的情況下,catch 代碼塊也觸發(fā)了異常,那么 fnally 代碼塊同樣會運行,并會拋出 catch 代碼塊觸發(fā)的異常。在某些極端不幸的情況下,fnally 代碼塊也觸發(fā)了異常,那么只好中斷當(dāng)前 fnally 代碼塊的執(zhí)行,并往外拋異常。

2.異常的分類

使用JVM捕獲Java異常的方法

1.所有異常的父類都是Throwable
2.Error異常是程序的執(zhí)行狀態(tài)無法恢復(fù)的狀態(tài),只能中止線程甚至中止JVM的異常
3.Exception是相對Error沒有這么嚴(yán)重的異常
4.Runtime Exception和Error都屬于不需要檢查的異常
5.除了Runtime Exception和Error的異常都是Check Exception異常
6.Check Exception異常都是需要顯式捕獲的異常

3.Java虛擬機是如何捕獲異常的?
java虛擬機構(gòu)造異常實例非常昂貴。虛擬機需要生成該異常的棧軌跡。該操作會逐一訪問當(dāng)前線程的 Java 棧幀,并且記錄下各種調(diào)試信息,包括棧幀所指向方法的名字,方法所在的類名、文件名,以及在代碼中的第幾行觸發(fā)該異常。
既然異常實例的構(gòu)造十分昂貴,我們是否可以緩存異常實例,在需要用到的時候直接拋出呢?從語法角度上來看,這是允許的。然而,該異常對應(yīng)的棧軌跡并非 throw 語句的位置,而是新建異常的位置。
因此,這種做法可能會誤導(dǎo)開發(fā)人員,使其定位到錯誤的位置。這也是為什么在實踐中,我們往往選擇拋出新建異常實例的原因。

異常處理器
1.來源:每個方法在編譯的時候都會生成一個異常表。異常表里面的每一個條目都代表一個異常處理器。
2.組成:
(1)from指針,to指針:代表捕獲異常的范圍,就是Try的范圍。
(2)target指針:代表處理器的開始位置,就是catch的起始位置。
(3)捕獲的異常類型。
3.捕獲異常
(1)當(dāng)程序觸發(fā)異常時,Java 虛擬機會從上至下遍歷異常表中的所有條目。當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個異常表條目的監(jiān)控范圍內(nèi),Java 虛擬機會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。如果匹配,Java 虛擬機會將控制流轉(zhuǎn)移至該條目 target 指針指向的字節(jié)碼。
(2)如果遍歷完所有異常表條目,Java 虛擬機仍未匹配到異常處理器,那么它會彈出當(dāng)前方法對應(yīng)的Java 棧幀,并且在調(diào)用者(caller)中重復(fù)上述操作。在最壞情況下,Java 虛擬機需要遍歷當(dāng)前線程 Java 棧上所有方法的異常表。
4.finally代碼的編譯:當(dāng)前版本 Java 編譯器的做法,是復(fù)制 fnally 代碼塊的內(nèi)容,分別放在 try-catch 代碼塊所有正常執(zhí)行路徑以及異常執(zhí)行路徑的出口中。

代碼1:
Try{
Try block
} catch {
Catch block
} finally {
Finally block
}
代碼2:
Try {
Try block
Finally block
} catch {
Catch block
Finally block
} finally{
Finally block
}
代碼1是我們的Java代碼,代碼2是編譯之后的Java代碼。

注意:如果 catch 代碼塊捕獲了異常,并且觸發(fā)了另一個異常,那么 fnally 捕獲并且重拋的異常是哪個呢?答案是后者。也就是說原本的異常便會被忽略掉,這對于代碼調(diào)試來說十分不利。

5.Java7的 Supressed 異常以及語法糖

針對上節(jié)說的會將catch的異常忽略掉,Java7引入了 Supressed 異常處理這個問題。但是使用起來還是很麻煩(沒有感受,

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享使用JVM捕獲Java異常的方法內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來學(xué)習(xí)!


新聞標(biāo)題:使用JVM捕獲Java異常的方法
鏈接URL:http://weahome.cn/article/gisish.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部