成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java異常處理

Fourierr / 1897人閱讀

摘要:可以被異常處理機(jī)制使用,是異常處理的核心。非檢測異常,在編譯時(shí),不會(huì)提示和發(fā)現(xiàn)異常的存在,不強(qiáng)制要求程序員處理這樣的異常??傮w來說,語言的異常處理流程,從程序中獲取異常信息。處理運(yùn)行時(shí)異常,采用邏輯合理規(guī)避同時(shí)輔助處理。

目錄

什么是Java異常?

當(dāng)一個(gè)Exception在程序中發(fā)生的時(shí)候,JVM是怎么做的呢?

當(dāng)我們編寫程序的時(shí)候如何對待可能出現(xiàn)的異常呢?

正文

1. 什么是Java異常?

今天我們來聊聊java異常,異常是導(dǎo)致程序中斷執(zhí)行的一種指令流。我們在提高代碼穩(wěn)定性和健壯性的時(shí)候,常常會(huì)花更多的時(shí)間去考慮,代碼可能存在的異常。編碼中對可能的發(fā)生的異常先一步正確處理,就可以確保異常不會(huì)導(dǎo)致程序不可用。說了這么多異常,那么異常是什么呢?

Java異常是一種導(dǎo)致程序中斷的執(zhí)行指令流。它存在應(yīng)用服務(wù)器硬件錯(cuò)誤、程序編寫的時(shí)候未考慮數(shù)組越界、也可能是網(wǎng)絡(luò)通信中網(wǎng)絡(luò)抖動(dòng)的客觀原因?qū)е碌漠惓5惹闆r。異??赡苁侵饔^代碼設(shè)計(jì)不周全也可能是客觀硬件報(bào)錯(cuò),那么認(rèn)識(shí)異常就是避免異常的第一步。我們先從異常家族的認(rèn)識(shí)開始,下面異常的族譜:

Throwable類作為所有異常的發(fā)源,他是整個(gè)Java異常體系的超體,其下面分為ErrorException兩大類。

Error與其子類實(shí)例代表嚴(yán)重系統(tǒng)錯(cuò)誤,應(yīng)用程序無法處理,如硬件層面的錯(cuò)誤、JVM錯(cuò)誤或內(nèi)存不足等問題,這種錯(cuò)誤發(fā)生時(shí)Java應(yīng)用程序本身無力恢復(fù)。Error對象拋出時(shí),基本上不用處理,任其傳播至JVM為止,應(yīng)用程序能做的最多留下日志信息。

Exception代表程序運(yùn)行時(shí)發(fā)送的各種不期望發(fā)生的事件??梢员籎ava異常處理機(jī)制使用,是異常處理的核心。Exception及其子類可以被程序處理,也就是所在應(yīng)用程序中正確的處理了Exception及其子類就能提高代碼的穩(wěn)定性和健壯性。

Exception類下面分為檢測異常非檢測異常

檢測異常,是JVM強(qiáng)制要求程序員為可能出現(xiàn)的異常做預(yù)備處理工作。JVM規(guī)定檢測異常要么使用try-catch語句捕獲它并進(jìn)行處理,要么使用throws子句聲明并拋出它,否者javac在編譯程序會(huì)不通過。這類異常一般是程序運(yùn)行環(huán)境導(dǎo)致的,為了預(yù)防未知環(huán)境對程序的影響,規(guī)定程序員需要處理這類異常。

非檢測異常,javac在編譯時(shí),不會(huì)提示和發(fā)現(xiàn)異常的存在,JVM不強(qiáng)制要求程序員處理這樣的異常。當(dāng)然,作為程序員我們應(yīng)該預(yù)防這樣的異常導(dǎo)致程序崩潰,所以建議使用try-catch-finally處理它。這類異常原因多半是代碼寫的邏輯有問題或考慮不周全。

2.當(dāng)一個(gè)Exception在程序中發(fā)生的時(shí)候,JVM是怎么做的呢?

對java整體異常家族有了大致的認(rèn)識(shí)之后,那么當(dāng)一個(gè)Exception在程序中發(fā)生的時(shí)候,JVM是怎么做的呢?

認(rèn)識(shí)這個(gè)問題,我們首看看JVM是如何執(zhí)行java代碼的,JVM將class文件轉(zhuǎn)換為JVM的java類。JVM為java類建立方法表,方法表中的索引可以引導(dǎo)JVM找到需要執(zhí)行的方法體和JVM方法執(zhí)行棧。當(dāng)然,invokemethod調(diào)用執(zhí)行一個(gè)方法的時(shí)候,Java虛擬機(jī)把描述該方法的棧結(jié)構(gòu)置入方法執(zhí)行棧棧頂,位于棧頂?shù)姆椒檎趫?zhí)行的方法。 JVM會(huì)為每一個(gè)方法建立執(zhí)行的堆和棧用于存放執(zhí)行中的變量,如果此時(shí)程序出現(xiàn)一個(gè)Exception,拋出的異常先轉(zhuǎn)移給合適的異常處理語句。代碼的執(zhí)行會(huì)被相應(yīng)的Exception執(zhí)行流接管,將方法表信息、發(fā)生異常的位置信息和方法的堆棧信息壓入Exception的堆棧,當(dāng)程序中斷的時(shí)候IDE就會(huì)將Exception的堆棧信息打印出來。

如果我們通過try…..catch….finally語句來處理異常,處理流程又是怎樣的呢?在try代碼塊中拋出的異常,代碼執(zhí)行流會(huì)跳轉(zhuǎn)到catch代碼塊執(zhí)行,catch代碼塊可以對發(fā)生的異常進(jìn)行補(bǔ)救。讓代碼回歸到正常的執(zhí)行流程。finally語句,無論在try模塊中是否發(fā)生異常,都會(huì)執(zhí)行finally語句,使用finally語句主要是為了釋放被占用的資源,比如打開的文件或鏈接的通信資源等。

總體來說,Java語言的異常處理流程,從程序中獲取異常信息。根據(jù)Java的源文件和用戶調(diào)用的包列表,JVM可以獲取該程序包括Java API所引發(fā)的異常在內(nèi)的異常處理的信息,這些信息包括:異常引發(fā)位置、異常拋出順序、引發(fā)異常的方法名和類名等。這些異常信息在程序異常的排查和修改的時(shí)候非常重要,后面會(huì)講到如何正確處理這些異常。

3.當(dāng)我們編寫程序的時(shí)候如何對待可能出現(xiàn)的異常呢?

通常在發(fā)生異常的時(shí)候我們有兩種處理模型:終止與恢復(fù)。
終止模型:前提是假設(shè)錯(cuò)誤非常關(guān)鍵,以至于程序無法返回到程序正常運(yùn)行軌跡,一旦異常拋出就意味著程序?qū)⑼V固峁┓?wù)。如:數(shù)據(jù)庫連接異常發(fā)生。

恢復(fù)模型:也就是異常程序發(fā)生錯(cuò)誤,錯(cuò)誤可以被修復(fù)然后重新回到正常程序執(zhí)行的軌跡上。例如,我們可以將數(shù)據(jù)庫連接try。。。catch置于循環(huán)中,一次連接不成功可以循環(huán)下一次進(jìn)行連接。

配合終止和恢復(fù)模型,我們會(huì)配合使用throw和throws語法。throws關(guān)鍵字主要在方法簽名中使用,用于聲明該方法可能拋出的異常。throws 可以理解成是一種通知行為,沒有實(shí)際的拋出異常的動(dòng)作,而僅僅是告訴調(diào)用他的上層函數(shù),這里可能會(huì)拋出這個(gè)異常;

throw用于在函數(shù)體內(nèi)語句中,表示拋出一個(gè)實(shí)際的異常的實(shí)際動(dòng)作,如果在函數(shù)內(nèi)沒有捕獲并處理,那么將會(huì)一直向上拋出這個(gè)異常直到被main()/Thread.run()拋出。

我們了解了Java的異常內(nèi)容之后,在程序中遵循怎樣的行業(yè)規(guī)則和大牛的經(jīng)驗(yàn)合理使用異常,提高代碼的穩(wěn)定性呢?

下面整理了包括Effective Java異常使用指導(dǎo)原則和網(wǎng)上博客內(nèi)容:

不要講異常處理用于正常的控制流(設(shè)計(jì)良好的API不應(yīng)該強(qiáng)迫它的調(diào)用者為了正常的控制流而使用異常)。

對可以恢復(fù)的情況使用了受檢異常,對編程錯(cuò)誤使用運(yùn)行時(shí)異常。

避免不必要的使用受檢異常(可以通過一些狀態(tài)檢測手段來避免異常的發(fā)生)。

優(yōu)先使用標(biāo)準(zhǔn)異常。

每個(gè)方法拋出的異常都要有文檔。

保持異常的原子性。

不要再catch中忽略掉捕獲到的異常。

處理運(yùn)行時(shí)異常,采用邏輯合理規(guī)避同時(shí)輔助try…catch處理。

在多重catch快后面,可以加一個(gè)catch(Exception)來處理可能會(huì)被遺漏的異常。

對于不確定的代碼,也可以加上try…catch,處理潛在的異常。

盡量去處理異常,切忌只是簡單的調(diào)用printStackTrace()打印輸出。

具體如何處理異常,要根據(jù)不同的業(yè)務(wù)需求和異常類型去決定。

盡量添加finally語句塊去釋放占用的資源。

不要被這么多規(guī)則嚇到了,不需要逐條強(qiáng)記他們。我對異常的理解,首先態(tài)度上要謙虛明白代碼中很難避免因?yàn)榭紤]不周出現(xiàn)的異常,所以編碼時(shí)應(yīng)該采用防衛(wèi)式編碼。其次在編碼處理過程中使用try…catch…finally語句預(yù)防可能的異常,采用合適的異常處理模式對待程序可能的異常。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76989.html

相關(guān)文章

  • 16.java異常處理

    摘要:不受檢查異常為編譯器不要求強(qiáng)制處理的異常,檢查異常則是編譯器要求必須處置的異常。潛在的異常處理器是異常發(fā)生時(shí)依次存留在調(diào)用棧中的方法的集合。當(dāng)運(yùn)行時(shí)系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器,則運(yùn)行時(shí)系統(tǒng)終止。異常處理涉及到五個(gè)關(guān)鍵字,分別是。 概念 程序運(yùn)行時(shí),發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。 異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并...

    asce1885 評(píng)論0 收藏0
  • Java異常處理

    摘要:異常也就是指程序運(yùn)行時(shí)發(fā)生錯(cuò)誤,而異常處理就是對這些錯(cuò)誤進(jìn)行處理和控制。有兩個(gè)重要的子類異常和錯(cuò)誤,二者都是異常處理的重要子類,各自都包含大量子類。需要注意的是,一旦某個(gè)捕獲到匹配的異常類型,將進(jìn)入異常處理代碼。 1,異?,F(xiàn)象 程序錯(cuò)誤分為三種:1,編譯錯(cuò)誤;2,運(yùn)行時(shí)錯(cuò)誤;3,邏輯錯(cuò)誤。 編譯錯(cuò)誤是因?yàn)槌绦驔]有遵循語法規(guī)則,編譯程序能夠自己發(fā)現(xiàn)并且提示我們錯(cuò)誤的原因和位置,這...

    CarlBenjamin 評(píng)論0 收藏0
  • Java 異常處理

    摘要:下面是異常處理機(jī)制的語法結(jié)構(gòu)業(yè)務(wù)實(shí)現(xiàn)代碼輸入不合法如果執(zhí)行塊里業(yè)務(wù)邏輯代碼時(shí)出現(xiàn)異常,系統(tǒng)自動(dòng)生成一個(gè)異常對象,該對象被提交給運(yùn)行時(shí)環(huán)境,這個(gè)過程被稱為拋出異常。 Java的異常機(jī)制主要依賴于try、catch、finally、throw和throws五個(gè)關(guān)鍵字, try關(guān)鍵字后緊跟一個(gè)花括號(hào)括起來的代碼塊(花括號(hào)不可省略),簡稱try塊,它里面放置可能引發(fā)異常的代碼 catch后對...

    senntyou 評(píng)論0 收藏0
  • java異常處理機(jī)制的理解

    摘要:根據(jù)異常對象判斷是否存在異常處理。否則,范圍小的異常會(huì)因異常處理完成而無法處理。異常處理中使用作為異常的統(tǒng)一出口。 參考《第一行代碼java》《java程序設(shè)計(jì)教程》java中程序的錯(cuò)誤有語法錯(cuò)誤、語義錯(cuò)誤。如果是語法性錯(cuò)誤,在編譯時(shí)就可以檢查出來并解決。語義錯(cuò)誤是在程序運(yùn)行時(shí)出現(xiàn)的,在編譯時(shí)沒有錯(cuò)誤,但在運(yùn)行時(shí)可能會(huì)出現(xiàn)錯(cuò)誤導(dǎo)致程序退出,這些錯(cuò)誤稱為異常。在沒有異常處理的情況下,也即...

    khs1994 評(píng)論0 收藏0
  • Java異常處理 10 個(gè)最佳實(shí)踐

    摘要:為可恢復(fù)的錯(cuò)誤使用檢查型異常,為編程錯(cuò)誤使用非檢查型錯(cuò)誤。檢查型異常保證你對錯(cuò)誤條件提供異常處理代碼,這是一種從語言到強(qiáng)制你編寫健壯的代碼的一種方式,但同時(shí)會(huì)引入大量雜亂的代碼并導(dǎo)致其不可讀。在編程中選擇檢查型異常還是運(yùn)行時(shí)異常。 異常處理是Java 開發(fā)中的一個(gè)重要部分。它是關(guān)乎每個(gè)應(yīng)用的一個(gè)非功能性需求,是為了處理任何錯(cuò)誤狀況,比如資源不可訪問,非法輸入,空輸入等等。Java提供了...

    Forelax 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Fourierr

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<