成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java兩種主要異常的差別

開(kāi)發(fā) 后端
Java提供了兩類(lèi)主要的異常:runtime exception和checked exception。本文從機(jī)制和邏輯上,簡(jiǎn)要介紹了這兩種異常之間的差別。

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

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

  一、機(jī)制上

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

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

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

  1. public class ExceptionalClass  
  2. {  
  3.  public void method1()  
  4.   throws CheckedException  
  5.   {  
  6.    // ... throw new CheckedException( “...出錯(cuò)了“ );  
  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)注意到了,兩個(gè)方法method1()和method2()都會(huì)拋出exception,可是只有method1()做了聲明。另外,method3()本身并不會(huì)拋出exception,可是它卻聲明會(huì)拋出CheckedException。在向你解釋之前,讓我們先來(lái)看看這個(gè)類(lèi)的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(),你必須把這個(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)衍生出來(lái)的。

  * Checked exceptions:

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

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

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

#p#

  二、邏輯上

  從邏輯的角度來(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類(lèi)的構(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è)例子:

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

  在運(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)。

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

【編輯推薦】

  1. Java異常處理原理及應(yīng)用
  2. 應(yīng)用技巧:Java中的異常處理
  3. Java異常學(xué)習(xí)心得
  4. Java異常處理的優(yōu)劣之道
  5. 全面掌握J(rèn)ava的異常處理機(jī)制
責(zé)任編輯:韓亞珊 來(lái)源: 豆豆網(wǎng)
相關(guān)推薦

2010-11-22 13:45:43

MySQL表存儲(chǔ)結(jié)構(gòu)

2025-01-26 00:00:25

限流組件HTTP

2010-10-25 10:31:51

Oracle函數(shù)

2011-04-02 09:48:38

深拷貝

2011-06-16 10:02:08

JAVA靜態(tài)載入

2010-10-11 10:31:51

MySQL分區(qū)

2013-05-27 14:31:34

Hadoop 2.0

2009-09-14 19:25:09

Ruby form

2021-05-27 10:57:01

TCP定時(shí)器網(wǎng)絡(luò)協(xié)議

2010-09-17 09:37:27

Java安裝方法

2011-03-03 10:26:04

Pureftpd

2010-03-16 15:23:32

java動(dòng)態(tài)載入

2009-06-25 13:43:00

Buffalo AJA

2010-10-21 16:24:18

sql server升

2024-06-06 08:32:52

.NET框架代碼

2010-03-11 14:34:47

Python環(huán)境

2010-02-23 18:05:40

WCF異常現(xiàn)象

2010-08-06 09:38:11

Flex讀取XML

2021-08-11 06:57:16

ShuffleSpark核心

2010-06-07 17:41:42

Sendmail 配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜免费av | 黄色毛片免费看 | 国产高清视频 | 国产日韩免费视频 | 精品国产伦一区二区三区观看方式 | 国产日韩一区二区 | 久久精品国产免费一区二区三区 | 巨大荫蒂视频欧美另类大 | 午夜精品导航 | 日本不卡视频 | av国产精品毛片一区二区小说 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 亚洲精品专区 | 国产亚洲精品久久午夜玫瑰园 | 国产高清一区二区三区 | 91中文字幕在线观看 | 国产高清自拍视频在线观看 | 成人国产精品久久久 | 国产免费播放视频 | 91精品国产综合久久久久久漫画 | av香蕉| 亚洲国产成人精品女人久久久 | 亚洲精品视频网站在线观看 | 国产女人第一次做爰毛片 | 成人在线免费网站 | 国产精品视频免费 | 99精品网 | 一级二级三级黄色 | 一区二区在线免费观看视频 | www日本高清 | 成人a免费 | 亚洲精品第一国产综合野 | 国产精品视频不卡 | 在线国产中文字幕 | www.一区二区三区 | 天天躁人人躁人人躁狂躁 | 国产精品美女久久久久aⅴ国产馆 | 国产精品亚洲第一区在线暖暖韩国 | 91精品国产91久久综合桃花 | 欧美黄色大片在线观看 | 久久久国产精品 |