欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
因小失大,切莫輕視JAVA異常處理

JAVA異常處理是程序開(kāi)發(fā)的一個(gè)重要內容,異常處理的好壞關(guān)系到系統的健壯性和穩定度。異常處理看起來(lái)只有幾個(gè)常用語(yǔ)句,故有些開(kāi)發(fā)人員常常會(huì )對異常處 理輕視和在使用上思路模糊。近期筆者在一個(gè)開(kāi)發(fā)項目中就體驗到輕視異常處理的慘痛教訓,因為對異常沒(méi)有處理好,后果是嚴重影響系統穩定性。因此,筆者認為 異常處理并不是表面看起來(lái)的那么簡(jiǎn)單。本文分享在此項目過(guò)程中對異常處理的一些看法。

一. 什么是異常
在JAVA程序運行時(shí),我們常常會(huì )出現一些非正常的現象,這種情況稱(chēng)為運行錯誤。根據其性質(zhì)可以分為錯誤和異常。JAVA用面向對象的方法處理異常,首先 會(huì )建立類(lèi)的層次。類(lèi) Throwable位于這一類(lèi)層次的最頂層,只有它的后代才可以作為一個(gè)異常被拋棄。類(lèi)Throwable有兩個(gè)直接子類(lèi):Error和 Exception。
一般來(lái)說(shuō)錯誤最常見(jiàn)的有程序進(jìn)入死循環(huán),內存泄漏等。這種情況,程序運行時(shí)本身無(wú)法解決,只能通過(guò)其他程序干預。JAVA對應的類(lèi)為Error類(lèi)。Error類(lèi)對象由JAVA虛擬機生成并拋棄(通常JAVA程序不對這類(lèi)異常進(jìn)行處理)。

異常是程序執行時(shí)遇到的非正常情況或意外行為。一般以下這些情況都可以引發(fā)異常:代碼或調用的代碼(如共享庫)中有錯誤,操作系統資源不可用,公共語(yǔ)言運 行庫遇到意外情況(如無(wú)法驗證代碼)等等。常見(jiàn)的有數組下標越界,算法溢出(超出數值表達范圍),除數為零,無(wú)效參數、內存溢出等。這種情況不像錯誤類(lèi)那 樣,程序運行時(shí)本身可以解決,由異常代碼調整程序運行方向,使程序仍可繼續運行直至正常結束。

JAVA對應的類(lèi)為Exception類(lèi)。Exception類(lèi)對象是JAVA程序處理或拋棄的對象。它有各種不同的子類(lèi)分別對應于不同類(lèi)型的異常。 JAVA編譯器要求程序必須捕獲或聲明所有的非運行時(shí)異常,但對運行時(shí)異??梢圆蛔鎏幚?。其中類(lèi)RuntimeException代表運行時(shí)由JAVA虛 擬機生成的異常,原因是編程錯誤。其它則為非運行時(shí)異常,原因是程序碰到了意外情況,如輸入輸出異常IOException等。

二. 異常處理程序的功效
當在程序運行過(guò)程中發(fā)生的異常事件,這些異常事件的發(fā)生將阻止程序的正常運行。為了加強程序的穩定性,程序設計時(shí),必須考慮到可能發(fā)生的異常事件并做出相應的處理。因此, 異常處理程序就是能夠讓系統在出現異常的情況下恢復過(guò)來(lái)的程序。

JAVA通過(guò)面向對象的程序來(lái)處理異常。在一個(gè)程序的運行過(guò)程中,如果發(fā)生了異常,則這個(gè)程序生成代表該異常的一個(gè)對象,并把它交給運行時(shí)系統,運行時(shí)系 統尋找相應的代碼來(lái)處理這一異常。我們把生成異常對象并把它提交給運行時(shí)系統的過(guò)程稱(chēng)為拋出異常(Throw)。異常拋出后,運行時(shí)系統從生成對象的代碼 開(kāi)始,沿程序的調用棧逐層回溯查找,直到找到包含相應處理的程序,并把異常對象交給該程序為止,這個(gè)過(guò)程稱(chēng)為捕獲異常(Catch)。

為了使異常處理更出色地發(fā)揮它的功效,程序員需要對所有可能發(fā)生的異常,預制各式各樣的異常類(lèi)和錯誤類(lèi)。它們都是從拋出異常類(lèi)Throwable繼承而來(lái)的,它派生出兩個(gè)類(lèi)Error和Exception。

由Error派生的子類(lèi)命名為XXXError,其中詞XXX是描述錯誤類(lèi)型的詞。由Exception派生的子類(lèi)命名為XXXException,其中 詞XXX是描述異常類(lèi)型的詞。Error類(lèi)處理的是運行使系統發(fā)生的內部錯誤,是不可恢復的,唯一的辦法是終止運行程序。因此,一般來(lái)說(shuō)開(kāi)發(fā)人員只要掌握 和處理好Exception類(lèi)就可以了。對于運行時(shí)異常RuntimeException,我們沒(méi)必要專(zhuān)門(mén)為它寫(xiě)一個(gè)異??刂破?,因為它們是由于編程不嚴 謹而造成的邏輯錯誤。只要出現終止,它會(huì )自動(dòng)得到處理。需要開(kāi)發(fā)人員進(jìn)行異常處理的是那些非運行期異常。

三、異常處理的兩種思路
JAVA異常處理的一個(gè)好處就是允許我們在一個(gè)地方將精力集中在要解決的問(wèn)題上,然后在另一個(gè)地方對待來(lái)自那個(gè)代碼內部的錯誤。我們只需要在那個(gè)可能發(fā)生 異常的地方設置“監視區”,我們對此區域日夜監視著(zhù),通常它是一個(gè)語(yǔ)句塊。同時(shí)我們還需要在另一個(gè)地方設置處理問(wèn)題模塊,如“異常處理模塊”或者“異???制器”。這樣可有效減少代碼量,并將那些用于描述具體操作的代碼與專(zhuān)門(mén)糾正異常的代碼分隔開(kāi)。一般情況下,會(huì )讓用于讀取、寫(xiě)入以及調試的代碼會(huì )變得更富有 條理。

一般來(lái)說(shuō)有兩種思路處理異常。第一種將含有異常出口的程序直接放到try塊中,然后由緊隨其后的catch塊捕捉。JAVA由try…catch語(yǔ)法來(lái)處 理異常,將關(guān)聯(lián)有異常類(lèi)的程序包含在try{}程序塊中,catch(){}關(guān)鍵字可以使用形參,用于和程序產(chǎn)生的異常對象結合。當調用某個(gè)程序時(shí),引起 異常事件發(fā)生的條件成立,便會(huì )拋出異常,原來(lái)的程序流程將會(huì )在此程序處中斷,然后try模塊后緊跟的catch中的形參和此異常對象完成了結合,繼而進(jìn)入 了catch模塊中運行。

這里引用一個(gè)最簡(jiǎn)單的例子來(lái)說(shuō)明: int myMethod(int dt)...{int data = 0; try{ int data = isLegal(dt); }catch(LowZeroException e)...{ System。out。println("發(fā)生數據錯誤!");} return data;}


第二種是不直接監聽(tīng)捕捉被引用程序的異常,而是將這個(gè)異常關(guān)聯(lián)傳遞給引用程序,同時(shí)監聽(tīng)捕捉工作也相應向上傳遞。

四. 解讀五個(gè)異常處理語(yǔ)句的應用教訓

  筆者結合本次項目教訓談?wù)凧AVA異常處理的五個(gè)關(guān)鍵語(yǔ)句:try,catch,throw,throws,finally。希望能與大家分享在本次項目開(kāi)發(fā)遇到的問(wèn)題和總結一些經(jīng)驗教訓。
 
4.1 Try和catch的教訓
  try語(yǔ)句用{}指定了一段代碼,該段代碼可能會(huì )拋棄一個(gè)或多個(gè)異常。catch語(yǔ)句的參數類(lèi)似于程序的聲明,包括一個(gè)異常類(lèi)型和一個(gè)異常對象。異常 類(lèi)型必須為T(mén)hrowable類(lèi)的子類(lèi),它指明了catch語(yǔ)句所處理的異常類(lèi)型,異常對象則由運行時(shí)系統在try所指定的代碼塊中生成并被捕獲,大括號 中包含對象的處理,其中可以調用對象的程序。
  
JAVA運行時(shí)系統從上到下分別對每個(gè)catch語(yǔ)句處理的異常類(lèi)型進(jìn)行檢測,直到找到類(lèi)型相匹配的catch語(yǔ)句為止。這里類(lèi)型匹配指catch所處理 的異常類(lèi)型與生成的異常對象的類(lèi)型完全一致或者是它的父類(lèi)。因此,catch語(yǔ)句的排列順序應該是從特殊到一般。也可以用一個(gè)catch語(yǔ)句處理多個(gè)異常 類(lèi)型,這時(shí)它的異常類(lèi)型參數應該是這多個(gè)異常類(lèi)型的父類(lèi),程序設計中要根據具體的情況來(lái)選擇catch語(yǔ)句的異常處理類(lèi)型。

異常被異常處理程序捕獲和處理,異常處理程序緊接在try塊后面,且用catch關(guān)鍵字標記,因此叫做“catch塊”。如果一個(gè)程序使用了異常規范,我 們在調用它時(shí)必須使用try-catch結構來(lái)捕獲和處理異常規范所指示的異常,否則編譯程序會(huì )報錯而不能通過(guò)編譯。這正是JAVA的異常處理的杰出貢 獻,它對可能發(fā)生的意外及早預防從而加強了代碼的健壯性。

在這次項目中得到一個(gè)教訓是不要用一個(gè)catch語(yǔ)句捕獲所有的異常和試圖處理所有可能出現的異常。一個(gè)程序中可能會(huì )產(chǎn)生多種不同的異常,我們可以設置多 個(gè)異常拋出點(diǎn)來(lái)解決這個(gè)問(wèn)題。異常對象從產(chǎn)生點(diǎn)產(chǎn)生后,到被捕捉后終止生命的全過(guò)程中,實(shí)際上是一個(gè)傳值過(guò)程,所以我們需要根據實(shí)際需要來(lái)合理的控制檢測 到異常的個(gè)數。catch語(yǔ)句表示我們預期會(huì )出現某種異常,而且希望能夠處理該異常。我們建議在catch語(yǔ)句中應該盡可能指定具體的異常類(lèi)型,必要時(shí)使 用多個(gè)catch,用于分別處理不同類(lèi)的異常。

實(shí)際上絕大多數異常都直接或間接從JAVA.ang.Exception派生。例如我們想要捕獲一個(gè)最明顯的異常是SQLException,這是 JDBC操作中常見(jiàn)的異常。另一個(gè)可能的異常是IOException,因為它要操作 OutputStreamWriter。顯然,在同一個(gè)catch塊中處理這兩種截然不同的異常是不合適的。如果用兩個(gè)catch塊分別捕獲 SQLException和IOException就要好多了。這就是說(shuō),catch語(yǔ)句應當盡量指定具體的異常類(lèi)型,而不應該指定涵蓋范圍太廣的 Exception類(lèi)。

在此項目另一個(gè)教訓是初級開(kāi)發(fā)人員總喜歡把大量的代碼放入單個(gè)try塊,這個(gè)壞習慣使我們在測試和分析問(wèn)題過(guò)程中花費了大量的時(shí)間。把大量的代碼放入單個(gè) try塊,然后再在catch語(yǔ)句中聲明Exception,而不是分離各個(gè)可能出現異常的段落并分別捕獲其異常。這種做法為分析程序拋出異常的原因帶來(lái) 了困難,因為一大段代碼中有太多的地方可能拋出Exception。程序的條理性和可閱讀性也會(huì )變得非常差,因此我們需要盡量減小try塊的體積。

異常處理中還有一種特殊情況---RuntimeException異常類(lèi),這個(gè)異常類(lèi)和它的所有子類(lèi)都有一個(gè)特性,就是異常對象一產(chǎn)生就被JAVA虛擬 機直接處理掉,即在程序中出現throw 子句的地方便被虛擬機捕捉了。因此凡是拋出這種運行時(shí)異常的程序在被引用時(shí),不需要用try…catch語(yǔ)句來(lái)處理異常。


異常處理語(yǔ)句的一般格式是:

try ...{// 可能產(chǎn)生異常的代碼 }catch (異常對象 e) ...{ //異常 e的處理語(yǔ)句 }catch (異常對象 e1) ...{ //異常 e的處理語(yǔ)句 }catch (異常對象 e2) ...{ //異常 e的處理語(yǔ)句 }
4.2 解讀Throw和throws區別
在使用異常規范的程序聲明中,開(kāi)發(fā)人員使用throw語(yǔ)句來(lái)拋出異常,throw總是出現在函數體中。程序會(huì )在throw語(yǔ)句后立即終止,它后面的語(yǔ)句執行不到,然后在包含它的所有try塊中從里向外尋找含有與其匹配的catch子句的try塊。
throw語(yǔ)句的格式為:
throw new XXXException();
由此可見(jiàn),throw語(yǔ)句拋出的是XXX類(lèi)型的異常的對象(隱式的句柄)。而catch控制器捕獲對象時(shí)要給出一個(gè)句柄 catch(XXXException e)。

如果一個(gè)Java程序遇到了它不能夠處理的情況,那么它可以?huà)伋鲆粋€(gè)異常:一個(gè)程序不僅告訴Java編譯器它能返回什么值,還可以告訴編譯器它有可能產(chǎn)生 什么錯誤。JAVA為了使開(kāi)發(fā)人員準確地知道要編寫(xiě)什么代碼來(lái)捕獲所有潛在的異常,采用一種叫做throws的語(yǔ)法結構。它用來(lái)通知那些要調用程序的開(kāi)發(fā) 人員,他們可能從自己的程序里拋出什么樣的異常。這便是所謂的“異常規范”,它屬于程序聲明的一部分。

throw 子句用來(lái)拋出異常,而throws子句用來(lái)指定異常。throw 的操作數是Throwable所有派生類(lèi),Throwable的直接子類(lèi)是Exception(應捕獲的問(wèn)題,應進(jìn)行處理)與Error(重大系統問(wèn)題, 一般不捕獲)。拋出異常拋出點(diǎn)有try{}塊、, try{}塊某個(gè)深層嵌套的作用域、try{}塊某個(gè)深層嵌套的程序中。簡(jiǎn)單說(shuō)throws是指定throw拋出的異常。

throws總是出現在一個(gè)函數頭中,用來(lái)標明該成員函數可能拋出的各種異常。對大多數Exception子類(lèi)來(lái)說(shuō),JAVA 編譯器會(huì )強迫你聲明在一個(gè)成員函數中拋出的異常的類(lèi)型。如果你想明確地拋出一個(gè)RuntimeException,你必須用throws語(yǔ)句來(lái)聲明它的類(lèi) 型。
例如
void f() throws tooBig, tooSmall, divZero { 程序體}
若使用下述代碼:
void f() [ // 。。。
它意味著(zhù)不會(huì )從程序里拋出異常。

4.3. 巧妙應用finally使出口統一
異常改變了程序正常的執行流程。這個(gè)道理雖然簡(jiǎn)單,卻常常被人們忽視。我們在這次項目中就遇到這樣的情況,就是無(wú)論一個(gè)異常是否發(fā)生,必須執行某些特定的 代碼。比如文件已經(jīng)打開(kāi),關(guān)閉文件是必須的。再如在程序用到了Socket、JDBC連接之類(lèi)的資源,即使遇到了異常,正常來(lái)說(shuō)是也要正確釋放占用的資 源。

但是,在try所限定的代碼中,當拋棄一個(gè)異常時(shí),其后的代碼不會(huì )被執行。在catch區中的代碼在異常沒(méi)有發(fā)生的情況下也不會(huì )被執行。為了無(wú)論異常是否 發(fā)生都要執行的代碼,為此,JAVA提供了一個(gè)簡(jiǎn)化這類(lèi)操作的關(guān)鍵詞finally,也就是無(wú)論catch語(yǔ)句的異常類(lèi)型是否與所拋棄的異常的類(lèi)型一致, finally所指定的代碼都要被執行。Finally保證在try/catch/finally塊結束之前,執行清理任務(wù)的代碼有機會(huì )執行,它提供了統 一的出口。

五. 切莫輕視異常處理
常常會(huì )有一些程序員習慣在編程時(shí)拖延或忘記異常處理程序的編寫(xiě)。因為輕視異常這一壞習慣是如此常見(jiàn),它甚至已經(jīng)影響到了JAVA本身的設計。代碼捕獲了異 常卻不作任何處理,可以算得上JAVA編程中的殺手。從問(wèn)題出現的頻繁程度和禍害程度來(lái)看,如果你看到了出現異常的情況,可以百分之九十地肯定代碼存在問(wèn) 題。

最好的方法是在進(jìn)行系統設計就把異常處理融合在系統中,若系統一旦實(shí)現,就很難添加異常處理功能。因此從項目一開(kāi)始就應該著(zhù)手進(jìn)行異常處理,必須投入大精力把異常處理的策略融合到軟件產(chǎn)品中。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java異常處理
好程序員Java教程系列之異常定義
《Java Web應用程序開(kāi)發(fā)》01 異常
任務(wù)6 系統異常處理
異常
詳解Java中異常處理機制
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久