日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java兩種主要異常的差別

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

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括水磨溝網(wǎng)站建設(shè)、水磨溝網(wǎng)站制作、水磨溝網(wǎng)頁制作以及水磨溝網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,水磨溝網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到水磨溝省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

  一、機(jī)制上

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

 
 
 
  1. public class CheckedException extends Exception  
  2. {  
  3.  public CheckedException() {}  
  4.  public CheckedException( String message )  
  5.  {  
  6.   super( message );  
  7.  }  
  8. }  

  以及一個使用exception的例子:

 
 
 
  1. public class ExceptionalClass  
  2. {  
  3.  public void method1()  
  4.   throws CheckedException  
  5.   {  
  6.    // ... throw new CheckedException( “...出錯了“ );  
  7.   }  
  8.  public void method2( String arg )  
  9.   {  
  10.    if( arg == null )  
  11.    {  
  12.     throw new NullPointerException( “method2的參數(shù)arg是null!” );  
  13.    }  
  14.   }  
  15.  public void method3() throws CheckedException  
  16.   {  
  17.    method1();  
  18.   }  
  19. }  

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

 
 
 
  1. public static void main( String[] args )  
  2. {  
  3.  ExceptionalClass example = new ExceptionalClass();  
  4.  try 
  5.  {  
  6.   example.method1();  
  7.   example.method3();  
  8.  }  
  9.  catch( CheckedException ex ) { } example.method2( null );  
  10. }  

  在main()方法中,如果要調(diào)用method1(),你必須把這個調(diào)用放在try/catch程序塊當(dāng)中,因?yàn)樗鼤伋鯟hecked exception。

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

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

小結(jié):

  * Runtime exceptions:

  在定義方法時不需要聲明會拋出runtime exception;

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

  runtime exception是從java.lang.RuntimeException或java.lang.Error類衍生出來的。

  * Checked exceptions:

  定義方法時必須聲明所有可能會拋出的checked exception;

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

  checked exception是從java.lang.Exception類衍生出來的。

#p#

  二、邏輯上

  從邏輯的角度來說,checked exceptions和runtime exception是有不同的使用目的的。checked exception用來指示一種調(diào)用方能夠直接處理的異常情況。而runtime exception則用來指示一種調(diào)用方本身無法處理或恢復(fù)的程序錯誤。

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

  再看下面這個例子:

 
 
 
  1. public void method()  
  2. {  
  3.  int [] numbers = { 1, 2, 3 };  
  4.  int sum = numbers[0] numbers[3];  
  5. }  

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

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

  在程序中捕獲runtime exception還會帶來更多的問題:要捕獲哪些runtime exception?什么時候捕獲?runtime exception是不需要聲明的,你怎樣知道有沒有runtime exception要捕獲?你想看到在程序中每一次調(diào)用方法時,都使用try/catch程序塊嗎?

【編輯推薦】

  1. Java異常處理原理及應(yīng)用
  2. 應(yīng)用技巧:Java中的異常處理
  3. Java異常學(xué)習(xí)心得
  4. Java異常處理的優(yōu)劣之道
  5. 全面掌握J(rèn)ava的異常處理機(jī)制

網(wǎng)頁題目:Java兩種主要異常的差別
URL網(wǎng)址:http://www.dlmjj.cn/article/dpedcss.html