怎樣淺析Java語(yǔ)言中兩種異常的差別

怎樣淺析Java語(yǔ)言中兩種異常的差別,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

為樂(lè)至等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及樂(lè)至網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、樂(lè)至網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

淺析Java語(yǔ)言中兩種異常的差別

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

它們的不同之處表現(xiàn)在兩方面:機(jī)制上和邏輯上。

 一、機(jī)制上

它們?cè)跈C(jī)制上的不同表現(xiàn)在兩點(diǎn):1.如何定義方法;2. 如何處理拋出的異常。請(qǐng)看下面CheckedException的定義:

public class CheckedException extends Exception
{

public CheckedException() {}
public CheckedException( String message )
{
super( message );
}
}

以及一個(gè)使用exception的例子:

public class ExceptionalClass
{

public void method1()
throws CheckedException
{
 // ... throw new CheckedException( “...出錯(cuò)了“ );
}
public void method2( String arg )
{
 if( arg == null )
 {
  throw new NullPointerException( “method2的參數(shù)arg是null!” );
 }
}
public void method3() throws CheckedException
{
 method1();
}
}

你可能已經(jīng)注意到了,兩個(gè)方法method1()和method2()都會(huì)拋出exception,可是只有method1()做了聲明。另外,method3()本身并不會(huì)拋出exception,可是它卻聲明會(huì)拋出CheckedException。在向你解釋之前,讓我們先來(lái)看看這個(gè)類的main()方法:

public static void main( String[] args )
{

ExceptionalClass example = new ExceptionalClass();
try
{
example.method1();
example.method3();
}
catch( CheckedException ex ) { } example.method2( null );
}

在main()方法中,如果要調(diào)用method1(),你必須把這個(gè)調(diào)用放在try/catch程序塊當(dāng)中,因?yàn)樗鼤?huì)拋出Checked exception。

相比之下,當(dāng)你調(diào)用method2()時(shí),則不需要把它放在try/catch程序塊當(dāng)中,因?yàn)樗鼤?huì)拋出的exception不是checked exception,而是runtime exception。會(huì)拋出runtime exception的方法在定義時(shí)不必聲明它會(huì)拋出exception。

現(xiàn)在,讓我們?cè)賮?lái)看看method3()。它調(diào)用了method1()卻沒(méi)有把這個(gè)調(diào)用放在try/catch程序塊當(dāng)中。它是通過(guò)聲明它會(huì)拋出method1()會(huì)拋出的exception來(lái)避免這樣做的。它沒(méi)有捕獲這個(gè)exception,而是把它傳遞下去。實(shí)際上main()方法也可以這樣做,通過(guò)聲明它會(huì)拋出Checked exception來(lái)避免使用try/catch程序塊(當(dāng)然我們反對(duì)這種做法)。

小結(jié)一下:

* Runtime exceptions:

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

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

runtime exception是從java.lang.RuntimeException或java.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 exceptions和runtime 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è)exception是checked exception,你的程序就可以捕獲它并正確處理:比如說(shuō)提示用戶重新輸入。

再看下面這個(gè)例子:

public void method()
{

int [] numbers = { 1, 2, 3 };
int sum = numbers[0] numbers[3];
}

在運(yùn)行方法method()時(shí)會(huì)遇到ArrayIndexOutOfBoundsException(因?yàn)閿?shù)組numbers的成員是從0到2)。對(duì)于這個(gè)異常,調(diào)用方無(wú)法處理/糾正。這個(gè)方法method()和上面的method2()一樣,都是runtime exception的情形。上面我已經(jīng)提到,runtime exception用來(lái)指示一種調(diào)用方本身無(wú)法處理/恢復(fù)的程序錯(cuò)誤。而程序錯(cuò)誤通常是無(wú)法在運(yùn)行過(guò)程中處理的,必須改正程序代碼。

總而言之,在程序的運(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)。

看完上述內(nèi)容,你們掌握怎樣淺析Java語(yǔ)言中兩種異常的差別的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

文章題目:怎樣淺析Java語(yǔ)言中兩種異常的差別
網(wǎng)頁(yè)URL:http://muchs.cn/article46/joghhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站導(dǎo)航、品牌網(wǎng)站制作、網(wǎng)站維護(hù)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)