小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java異常處理

 昵稱18593886 2014-07-17

  java異常處理機(jī)制主要依賴于trycatch,finallythrow,throws五個(gè)關(guān)鍵字。

try 關(guān)鍵字后緊跟一個(gè)花括號(hào)括起來(lái)的代碼塊,簡(jiǎn)稱try塊。同理:下面的也被稱為相應(yīng)的塊。

它里面可置引發(fā)異常的代碼。catch后對(duì)應(yīng)異常類型和一個(gè)代碼塊,用于表明catch塊用于處理這種類型的代碼塊。后還可以跟一個(gè)finally塊,finally塊用于回收在try塊里打開(kāi)的物理資源,異常機(jī)制會(huì)保證finally塊總被執(zhí)行。throws關(guān)鍵字主要在方法簽名中使用,用于聲明該方法可能拋出的異常,而throw則用于拋出一個(gè)實(shí)際的異常,throw可以單獨(dú)作為語(yǔ)句使用,拋出一個(gè)具體的異常的對(duì)象

  java異常處理可以讓程序具有更好的容錯(cuò)性,程序更加健壯。當(dāng)程序 出現(xiàn)意外情形時(shí),系統(tǒng)會(huì)自動(dòng)生成一個(gè)Exception對(duì)象來(lái)通知程序,從而實(shí)現(xiàn)將“業(yè)務(wù)功能實(shí)現(xiàn)代碼”和“錯(cuò)誤處理代碼”分離,提供更好的可讀性。

  如果執(zhí)行try塊里的業(yè)務(wù)邏輯代碼時(shí)出現(xiàn)異常,系統(tǒng)自動(dòng)會(huì)生成一個(gè)異常對(duì)象,該異常對(duì)象被提交給java運(yùn)行環(huán)境,這個(gè)過(guò)程被稱為拋出(throw)異常。當(dāng)java運(yùn)行環(huán)境收到異常對(duì)象時(shí),會(huì)尋找處理該異常對(duì)象的catch塊,如果找到合適的catch塊并把該異常交給它處理,該過(guò)程被稱為捕獲異常;如果java運(yùn)行環(huán)境找不到捕獲異常的catch塊,則運(yùn)行環(huán)境終止,程序也將退出。

  使用finally回收物理資源

  當(dāng)程序在try塊里打開(kāi)了的一些物理資源(數(shù)據(jù)庫(kù)連接,網(wǎng)絡(luò)連接及磁盤(pán)文件),這些物理資源必須顯示回收。

  為了保證一定能夠回收try塊中打開(kāi)的物理資源,異常處理機(jī)制提供了finally塊,無(wú)論try塊中的代碼是否出現(xiàn)異常,也不管在哪個(gè)catch塊中被執(zhí)行,finally塊總會(huì)被執(zhí)行。異常處理結(jié)構(gòu)語(yǔ)法中只有try塊是必須的,一旦沒(méi)有try塊,則不能出現(xiàn)catchfinally塊,如果存在try塊,則catch塊和finally塊都是可選的。但二者至少要出現(xiàn)其一。也可以同時(shí)出現(xiàn)多個(gè)catch塊。catch塊必須位于try塊后面,而finally必須位于catch塊后面(如果存在的話);

  當(dāng)java程序執(zhí)行try塊,catch塊,時(shí)遇到了return語(yǔ)句或throw語(yǔ)句,這兩個(gè)語(yǔ)句都會(huì)導(dǎo)致該方法的立即結(jié)束,但是系統(tǒng)并不會(huì)立即執(zhí)行這兩個(gè)語(yǔ)句,而是去尋找該異常處理流程中是否包含finally塊,如果沒(méi)有finally塊程序立即執(zhí)行return語(yǔ)句或throw語(yǔ)句,方法終止。反之,則系統(tǒng)會(huì)立即執(zhí)行finally塊——只有當(dāng)finally塊執(zhí)行完后,系統(tǒng)才會(huì)再次跳回來(lái)執(zhí)行try塊,catch塊里的returnthrow語(yǔ)句,如果同時(shí)在 finally塊中也存在returnthrow語(yǔ)句,則finally塊已經(jīng)終止了方法,自然不存在系統(tǒng)再次跳轉(zhuǎn)去執(zhí)行trycatch塊里的returnthrow語(yǔ)句。

  使用throws聲明拋出異常的思路是:當(dāng)前方法不知道應(yīng)該如何處理這種異常,該異常應(yīng)該由上一級(jí)調(diào)用者處理,如果main方法也不知道如何處理這種異常類型。也可以使用throws聲明拋出異常,把該異常交給javaJVM處理。

  JVM對(duì)異常的處理方法:打印異常跟蹤棧信息,并終止程序運(yùn)

runtime exceptionchecked exception

   Java提供了兩類主要的異常:runtime exceptionchecked exception。所有的checked exception是從java.lang.Exception類衍生出來(lái)的,而runtime exception則是從java.lang.RuntimeExceptionjava.lang.Error類衍生出來(lái)的。

  它們的不同之處表現(xiàn)在兩方面:機(jī)制上和邏輯上。 一、機(jī)制上 
  它們?cè)跈C(jī)制上的不同表現(xiàn)在兩點(diǎn):1.如何定義方法;2. 如何處理拋出的異常。

 * Runtime exceptions: 

  在定義方法時(shí)不需要聲明會(huì)拋出runtime exception; 

  在調(diào)用這個(gè)方法時(shí)不需要捕獲這個(gè)runtime exception; 

  runtime exception是從java.lang.RuntimeExceptionjava.lang.Error類衍生出來(lái)的。 

  * Checked exceptions: 

  定義方法時(shí)必須聲明所有可能會(huì)拋出的checked exception; 

  在調(diào)用這個(gè)方法時(shí),必須捕獲它的checked exception,不然就得把它的exception傳遞下去

  checked exception是從java.lang.Exception類衍生出來(lái)的。

二、邏輯上 
  從邏輯的角度來(lái)說(shuō),checked exceptionsruntime exception是有不同的使用目的的。checked exception用來(lái)指示一種調(diào)用方能夠直接處理的異常情況。而runtime exception則用來(lái)指示一種調(diào)用方本身無(wú)法處理或恢復(fù)的程序錯(cuò)誤。 

  checked exception迫使你捕獲它并處理這種異常情況。以java.net.URL類的構(gòu)建器(constructor)為例,它的每一個(gè)構(gòu)建器都會(huì)拋出MalformedURLException。MalformedURLException就是一種checked exception。設(shè)想一下,你有一個(gè)簡(jiǎn)單的程序,用來(lái)提示用戶輸入一個(gè)URL,然后通過(guò)這個(gè)URL去下載一個(gè)網(wǎng)頁(yè)。如果用戶輸入的URL有錯(cuò)誤,構(gòu)建器就會(huì)拋出一個(gè)exception。既然這個(gè)exceptionchecked exception,你的程序就可以捕獲它并正確處理:比如說(shuō)提示用戶重新輸入。

總而言之,在程序的運(yùn)行過(guò)程中一個(gè)checked exception被拋出的時(shí)候,只有能夠適當(dāng)處理這個(gè)異常的調(diào)用方才應(yīng)該用try/catch來(lái)捕獲它。而對(duì)于runtime exception,則不應(yīng)當(dāng)在程序中捕獲它。如果你要捕獲它的話,你就會(huì)冒這樣一個(gè)風(fēng)險(xiǎn):程序代碼的錯(cuò)誤(bug)被掩蓋在運(yùn)行當(dāng)中無(wú)法被察覺(jué)。因?yàn)樵诔绦驕y(cè)試過(guò)程中,系統(tǒng)打印出來(lái)的調(diào)用堆棧路徑(StackTrace)往往使你更快找到并修改代碼中的錯(cuò)誤。有些程序員建議捕獲runtime exception并紀(jì)錄在log中,我反對(duì)這樣做。這樣做的壞處是你必須通過(guò)瀏覽log來(lái)找出問(wèn)題,而用來(lái)測(cè)試程序的測(cè)試系統(tǒng)(比如Unit Test)卻無(wú)法直接捕獲問(wèn)題并報(bào)告出來(lái)。

針對(duì) RuntimeException 類型的異常, javac 是無(wú)法通過(guò)編譯時(shí)的靜態(tài)語(yǔ)法檢測(cè)來(lái)判斷到底哪些函數(shù)(或哪些區(qū)域的代碼)可能拋出這類異常(這完全取決于運(yùn)行時(shí)狀態(tài),或者說(shuō)運(yùn)行態(tài)所決定的)理解為non_checked可以?,也正因?yàn)槿绱耍?span lang="EN-US"> Java 異常處理模型中的“ must be caught or declared to be thrown ”規(guī)則也不適用于 RuntimeException (所以才有前面所提到過(guò)的奇怪編譯現(xiàn)象,這也屬于特殊規(guī)則吧)。但是, Java 虛擬機(jī)卻需要有效地捕獲并處理此類異常。當(dāng)然, RuntimeException 也可以被程序員顯式地拋出,而且為了程序的可靠性,對(duì)一些可能出現(xiàn)“運(yùn)行時(shí)異常( RuntimeException )”的代碼區(qū)域,程序員最好能夠及時(shí)地處理這些意外的異常,也即通過(guò) catch(RuntimeExcetion) catch(Exception) 來(lái)捕獲它們。

總結(jié):

所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個(gè)子類:ErrorException。error表示恢復(fù)不是不可能但很困難情況下的一種嚴(yán)重的問(wèn)題。比如說(shuō)內(nèi)存溢出,不可能指望程序處理這樣的情況,exception表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題,也就是說(shuō),它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。

異常表示程序運(yùn)行過(guò)程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見(jiàn)的運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出為被捕獲的運(yùn)行時(shí)異常。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多