精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java異常處理原理及應(yīng)用

開(kāi)發(fā) 后端
本文系統(tǒng)的闡述了 Java 異常處理的原理和方法,并列舉了一些實(shí)例,使讀者對(duì) Java 異常處理能有一個(gè)全面的認(rèn)識(shí),理解異常處理機(jī)制,能更加靈活和有效地在開(kāi)發(fā)中使用它。

Java異常處理是使用Java語(yǔ)言進(jìn)行軟件開(kāi)發(fā)和測(cè)試腳本開(kāi)發(fā)時(shí)不容忽視的問(wèn)題之一,是否進(jìn)行異常處理直接關(guān)系到開(kāi)發(fā)出的軟件的穩(wěn)定性和健壯性。我們?cè)?jīng)為大家介紹過(guò)《全面掌握J(rèn)ava的異常處理機(jī)制》,本文闡述了Java 異常處理的原理,并列舉了一些實(shí)例。

Java 異常處理引出

假設(shè)您要編寫(xiě)一個(gè) Java 程序,該程序讀入用戶(hù)輸入的一行文本,并在終端顯示該文本。

程序如下:

  1. import java.io.*;  
  2. public class EchoInput {  
  3.      public static void main(String args[]){  
  4.          System.out.println("Enter text to echo:");  
  5.          InputStreamReader isr = new InputStreamReader(System.in);  
  6.          BufferedReader inputReader = new BufferedReader(isr);  
  7.          String inputLine = inputReader.readLine();  
  8.          System.out.println("Read:" + inputLine);  
  9.   }  
  10. }  

分析上面的代碼,在 EchoInput 類(lèi)中,第 3 行聲明了 main 方法;第 4 行提示用戶(hù)輸入文本;第 5、6 行設(shè)置 BufferedReader 對(duì)像連接到 InputStreamReader,而 InputStreamReader 又連接到標(biāo)準(zhǔn)輸入流 System.in;第 7 行讀入一行文本;第 8 行用標(biāo)準(zhǔn)輸出流 System.out 顯示出該文本。

表面看來(lái)上面的程序沒(méi)有問(wèn)題,但實(shí)際上,EchoInput 類(lèi)完全可能出現(xiàn)問(wèn)題。要在調(diào)用第 7 行的 readLine 方法時(shí)正確讀取輸入,這幾種假設(shè)都必須成立:假定鍵盤(pán)有效,鍵盤(pán)能與計(jì)算機(jī)正常通信;假定鍵盤(pán)數(shù)據(jù)可從操作系統(tǒng)傳輸?shù)?Java 虛擬機(jī),又從 Java 虛擬機(jī)傳輸 inputReader。

大多數(shù)情況下上述假設(shè)都成立,但不盡然。為此,Java 采用異常方法,以應(yīng)對(duì)可能出現(xiàn)的錯(cuò)誤,并采取步驟進(jìn)行更正。在本例中,若試圖編譯以上代碼,將看到以下信息:

  1. Exception in thread "main" java.lang.Error: Unresolved compilation problem:  
  2.     Unhandled exception type IOException  
  3.     at EchoInput.main(EchoInput.java:7)  
  4.  

從中可以看到,第 7 行調(diào)用 readLine 方法可能出錯(cuò):若果真如此,則產(chǎn)生 IOException 來(lái)記錄故障。編譯器錯(cuò)誤是在告訴您,需要更改代碼來(lái)解決這個(gè)潛在的問(wèn)題。在 JDK API 文檔中,可以看到同樣的信息。我們可以看到 readLine 方法,如圖 1 所示。

圖 1. BufferedReader 類(lèi)的 readLine 方法的 JDK API 文檔
BufferedReader 類(lèi)的 readLine 方法的 JDK API 文檔

由上圖可知,readLine 方法有時(shí)產(chǎn)生 IOException。如何處理潛在的故障?編譯器需要“捕獲”或“聲明”IOException。

“捕獲 (catch)”指當(dāng) readLine 方法產(chǎn)生錯(cuò)誤時(shí)截獲該錯(cuò)誤,并處理和記錄該問(wèn)題。而“聲明 (declare)”指錯(cuò)誤可能引發(fā) IOException,并通知調(diào)用該方法的任何代碼:可能產(chǎn)生異常。

若要捕獲異常,必須添加一個(gè)特殊的“處理代碼塊”,來(lái)接收和處理 IOException。于是程序改為如下:

  1. import java.io.*;  
  2. public class EchoInputHandle {  
  3.      public static void main(String args[]){  
  4.          System.out.println("Enter text to echo:");  
  5.          InputStreamReader isr = new InputStreamReader(System.in);  
  6.          BufferedReader inputReader = new BufferedReader(isr);  
  7.          try{  
  8.              String inputLine = inputReader.readLine();  
  9.              System.out.println("Read:" + inputLine);  
  10.          }  
  11.          catch(IOException exc){  
  12.              System.out.println(“Exception encountered: ” + exc);  
  13.          }  
  14.      }  
  15. }  

新添的代碼塊包含關(guān)鍵字 try 和 catch(第 7,10,11,13 行),表示要讀取輸入。若成功,則正常運(yùn)行。若讀取輸入時(shí)錯(cuò)誤,則捕獲問(wèn)題(由 IOException 對(duì)象表示),并采取相應(yīng)措施。在本例,采用的處理方式是輸出異常。

若不準(zhǔn)備捕獲 IOException,僅聲明異常,則要特別指定 main 方法可能出錯(cuò),而且特別說(shuō)明可能產(chǎn)生 IOException。于是程序改為如下:

  1. import java.io.*;  
  2. public class EchoInputDeclare {  
  3.      public static void main(String args[]) throws IOException{  
  4.          System.out.println("Enter text to echo:");  
  5.          InputStreamReader isr = new InputStreamReader(System.in);  
  6.          BufferedReader inputReader = new BufferedReader(isr);  
  7.          String inputLine = inputReader.readLine();  
  8.          System.out.println("Read:" + inputLine);  
  9.   }  
  10. }  

從上面的這個(gè)簡(jiǎn)單的例子中,我們可以看出異常處理在 Java 代碼開(kāi)發(fā)中不能被忽視。

Java 異常以及異常處理

可將 Java 異常看作是一類(lèi)消息,它傳送一些系統(tǒng)問(wèn)題、故障及未按規(guī)定執(zhí)行的動(dòng)作的相關(guān)信息。異常包含信息,以將信息從應(yīng)用程序的一部分發(fā)送到另一部分。

編譯語(yǔ)言為何要處理異常?為何不在異常出現(xiàn)位置隨時(shí)處理具體故障?因?yàn)橛袝r(shí)候我們需要在系統(tǒng)中交流錯(cuò)誤消息,以便按照統(tǒng)一的方式處理問(wèn)題,有時(shí)是因?yàn)橛腥舾商幚韱?wèn)題的可能方式,但您不知道使用哪一種,此時(shí),可將處理異常的任務(wù)委托給調(diào)用方法的代碼。調(diào)用者通常更能了解問(wèn)題來(lái)源的上下文,能更好的確定恢復(fù)方式。

圖 2. 通用消息架構(gòu) 
通用消息架構(gòu)

從上圖可以看出,必定在運(yùn)行的 Java 應(yīng)用程序的一些類(lèi)或?qū)ο笾挟a(chǎn)生異常。出現(xiàn)故障時(shí),“發(fā)送者”將產(chǎn)生異常對(duì)象。異常可能代表 Java 代碼出現(xiàn)的問(wèn)題,也可能是 JVM 的相應(yīng)錯(cuò)誤,或基礎(chǔ)硬件或操作系統(tǒng)的錯(cuò)誤。

異常本身表示消息,指發(fā)送者傳給接收者的數(shù)據(jù)“負(fù)荷”。首先,異常基于類(lèi)的類(lèi)型來(lái)傳輸有用信息。很多情況下,基于異常的類(lèi)既能識(shí)別故障本因并能更正問(wèn)題。其次,異常還帶有可能有用的數(shù)據(jù)(如屬性)。

在處理異常時(shí),消息必須有接收者;否則將無(wú)法處理產(chǎn)生異常的底層問(wèn)題。

在上例中,異常“產(chǎn)生者”是讀取文本行的 BufferedReader。在故障出現(xiàn)時(shí),將在 readLine 方法中構(gòu)建 IOException 對(duì)象。異常“接收者”是代碼本身。EchoInputHandle 應(yīng)用程序的 try-catch 結(jié)構(gòu)中的 catch 塊是異常的接收者,它以字符串形式輸出異常,將問(wèn)題記錄下來(lái)。

Java 異常類(lèi)的層次結(jié)構(gòu)

在我們從總體上了解異常后,我們應(yīng)該了解如何在 Java 應(yīng)用程序中使用異常,即需要了解 Java 類(lèi)的層次結(jié)構(gòu)。圖 3 是 Java 類(lèi)的層次結(jié)構(gòu)圖。

圖 3. Java 類(lèi)的層次結(jié)構(gòu) 
 Java 類(lèi)的層次結(jié)構(gòu)

在 Java 中,所有的異常都有一個(gè)共同的祖先 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機(jī)制通過(guò) Java 應(yīng)用程序傳輸?shù)娜魏螁?wèn)題的共性。

Throwable 有兩個(gè)重要的子類(lèi):Exception(異常)和 Error(錯(cuò)誤),二者都是 Java 異常處理的重要子類(lèi),各自都包含大量子類(lèi)。

Exception(異常)是應(yīng)用程序中可能的可預(yù)測(cè)、可恢復(fù)問(wèn)題。一般大多數(shù)異常表示中度到輕度的問(wèn)題。異常一般是在特定環(huán)境下產(chǎn)生的,通常出現(xiàn)在代碼的特定方法和操作中。在 EchoInput 類(lèi)中,當(dāng)試圖調(diào)用 readLine 方法時(shí),可能出現(xiàn) IOException 異常。

Error(錯(cuò)誤)表示運(yùn)行應(yīng)用程序中較嚴(yán)重問(wèn)題。大多數(shù)錯(cuò)誤與代碼編寫(xiě)者執(zhí)行的操作無(wú)關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xiàn)的問(wèn)題。例如,當(dāng) JVM 不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn) OutOfMemoryError。

Exception 類(lèi)有一個(gè)重要的子類(lèi) RuntimeException。RuntimeException 類(lèi)及其子類(lèi)表示“JVM 常用操作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。

Java 異常的處理

在 Java 應(yīng)用程序中,對(duì)異常的處理有兩種方式:處理異常和聲明異常。

處理異常:try、catch 和 finally

若要捕獲異常,則必須在代碼中添加異常處理器塊。這種 Java 結(jié)構(gòu)可能包含 3 個(gè)部分,

都有 Java 關(guān)鍵字。下面的例子中使用了 try-catch-finally 代碼結(jié)構(gòu)。

  1. import java.io.*;  
  2. public class EchoInputTryCatchFinally {  
  3.      public static void main(String args[]){  
  4.          System.out.println("Enter text to echo:");  
  5.          InputStreamReader isr = new InputStreamReader(System.in);  
  6.          BufferedReader inputReader = new BufferedReader(isr);  
  7.          try{  
  8.              String inputLine = inputReader.readLine();  
  9.             System.out.println("Read:" + inputLine);       
  10.          }  
  11.          catch(IOException exc){  
  12.              System.out.println("Exception encountered: " + exc);  
  13.          }  
  14.          finally{  
  15.             System.out.println("End. ");  
  16.      }  
  17. }  
  18.  

其中:

try 塊:將一個(gè)或者多個(gè)語(yǔ)句放入 try 時(shí),則表示這些語(yǔ)句可能拋出異常。編譯器知道可能要發(fā)生異常,于是用一個(gè)特殊結(jié)構(gòu)評(píng)估塊內(nèi)所有語(yǔ)句。

catch 塊:當(dāng)問(wèn)題出現(xiàn)時(shí),一種選擇是定義代碼塊來(lái)處理問(wèn)題,catch 塊的目的便在于此。catch 塊是 try 塊所產(chǎn)生異常的接收者。基本原理是:一旦生成異常,則 try 塊的執(zhí)行中止,JVM 將查找相應(yīng)的 JVM。

finally 塊:還可以定義 finally 塊,無(wú)論運(yùn)行 try 塊代碼的結(jié)果如何,該塊里面的代碼一定運(yùn)行。在常見(jiàn)的所有環(huán)境中,finally 塊都將運(yùn)行。無(wú)論 try 塊是否運(yùn)行完,無(wú)論是否產(chǎn)生異常,也無(wú)論是否在 catch 塊中得到處理,finally 塊都將執(zhí)行。

try-catch-finally 規(guī)則:

必須在 try 之后添加 catch 或 finally 塊。try 塊后可同時(shí)接 catch 和 finally 塊,但至少有一個(gè)塊。

必須遵循塊順序:若代碼同時(shí)使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之后。

catch 塊與相應(yīng)的異常類(lèi)的類(lèi)型相關(guān)。

一個(gè) try 塊可能有多個(gè) catch 塊。若如此,則執(zhí)行第一個(gè)匹配塊。

可嵌套 try-catch-finally 結(jié)構(gòu)。

在 try-catch-finally 結(jié)構(gòu)中,可重新拋出異常。

除了下列情況,總將執(zhí)行 finally 做為結(jié)束:JVM 過(guò)早終止(調(diào)用 System.exit(int));在 finally 塊中拋出一個(gè)未處理的異常;計(jì)算機(jī)斷電、失火、或遭遇病毒攻擊。

聲明異常

若要聲明異常,則必須將其添加到方法簽名塊的結(jié)束位置。下面是一個(gè)實(shí)例:

  1. public void errorProneMethod(int input) throws java.io.IOException {  
  2.     //Code for the method,including one or more method  
  3.     //calls that may produce an IOException  
  4. }  

這樣,聲明的異常將傳給方法調(diào)用者,而且也通知了編譯器:該方法的任何調(diào)用者必須遵守處理或聲明規(guī)則。聲明異常的規(guī)則如下:

必須聲明方法可拋出的任何可檢測(cè)異常(checked exception)。

非檢測(cè)性異常(unchecked exception)不是必須的,可聲明,也可不聲明。

調(diào)用方法必須遵循任何可檢測(cè)異常的處理和聲明規(guī)則。若覆蓋一個(gè)方法,則不能聲明與覆蓋方法不同的異常。聲明的任何異常必須是被覆蓋方法所聲明異常的同類(lèi)或子類(lèi)。

Java 異常處理的分類(lèi)

Java 異常可分為可檢測(cè)異常,非檢測(cè)異常和自定義異常。

可檢測(cè)異常

可檢測(cè)異常經(jīng)編譯器驗(yàn)證,對(duì)于聲明拋出異常的任何方法,編譯器將強(qiáng)制執(zhí)行處理或聲明規(guī)則,例如:sqlExecption 這個(gè)異常就是一個(gè)檢測(cè)異常。你連接 JDBC 時(shí),不捕捉這個(gè)異常,編譯器就通不過(guò),不允許編譯。

非檢測(cè)異常

非檢測(cè)異常不遵循處理或聲明規(guī)則。在產(chǎn)生此類(lèi)異常時(shí),不一定非要采取任何適當(dāng)操作,編譯器不會(huì)檢查是否已解決了這樣一個(gè)異常。例如:一個(gè)數(shù)組為 3 個(gè)長(zhǎng)度,當(dāng)你使用下標(biāo)為3時(shí),就會(huì)產(chǎn)生數(shù)組下標(biāo)越界異常。這個(gè)異常 JVM 不會(huì)進(jìn)行檢測(cè),要靠程序員來(lái)判斷。有兩個(gè)主要類(lèi)定義非檢測(cè)異常:RuntimeException 和 Error。

Error 子類(lèi)屬于非檢測(cè)異常,因?yàn)闊o(wú)法預(yù)知它們的產(chǎn)生時(shí)間。若 Java 應(yīng)用程序內(nèi)存不足,則隨時(shí)可能出現(xiàn) OutOfMemoryError;起因一般不是應(yīng)用程序的特殊調(diào)用,而是 JVM 自身的問(wèn)題。另外,Error 一般表示應(yīng)用程序無(wú)法解決的嚴(yán)重問(wèn)題。

RuntimeException 類(lèi)也屬于非檢測(cè)異常,因?yàn)槠胀?JVM 操作引發(fā)的運(yùn)行時(shí)異常隨時(shí)可能發(fā)生,此類(lèi)異常一般是由特定操作引發(fā)。但這些操作在 Java 應(yīng)用程序中會(huì)頻繁出現(xiàn)。因此,它們不受編譯器檢查與處理或聲明規(guī)則的限制。

自定義異常

自定義異常是為了表示應(yīng)用程序的一些錯(cuò)誤類(lèi)型,為代碼可能發(fā)生的一個(gè)或多個(gè)問(wèn)題提供新含義。可以顯示代碼多個(gè)位置之間的錯(cuò)誤的相似性,也可以區(qū)分代碼運(yùn)行時(shí)可能出現(xiàn)的相似問(wèn)題的一個(gè)或者多個(gè)錯(cuò)誤,或給出應(yīng)用程序中一組錯(cuò)誤的特定含義。例如,對(duì)隊(duì)列進(jìn)行操作時(shí),有可能出現(xiàn)兩種情況:空隊(duì)列時(shí)試圖刪除一個(gè)元素;滿(mǎn)隊(duì)列時(shí)試圖添加一個(gè)元素。則需要自定義兩個(gè)異常來(lái)處理這兩種情況。

Java 異常處理的原則和忌諱

Java 異常處理的原則

盡可能的處理異常

要盡可能的處理異常,如果條件確實(shí)不允許,無(wú)法在自己的代碼中完成處理,就考慮聲明異常。如果人為避免在代碼中處理異常,僅作聲明,則是一種錯(cuò)誤和依賴(lài)的實(shí)踐。

具體問(wèn)題具體解決

異常的部分優(yōu)點(diǎn)在于能為不同類(lèi)型的問(wèn)題提供不同的處理操作。有效異常處理的關(guān)鍵是識(shí)別特定故障場(chǎng)景,并開(kāi)發(fā)解決此場(chǎng)景的特定相應(yīng)行為。為了充分利用異常處理能力,需要為特定類(lèi)型的問(wèn)題構(gòu)建特定的處理器塊。

記錄可能影響應(yīng)用程序運(yùn)行的異常

至少要采取一些永久的方式,記錄下可能影響應(yīng)用程序操作的異常。理想情況下,當(dāng)然是在第一時(shí)間解決引發(fā)異常的基本問(wèn)題。不過(guò),無(wú)論采用哪種處理操作,一般總應(yīng)記錄下潛在的關(guān)鍵問(wèn)題。別看這個(gè)操作很簡(jiǎn)單,但它可以幫助您用很少的時(shí)間來(lái)跟蹤應(yīng)用程序中復(fù)雜問(wèn)題的起因。

根據(jù)情形將異常轉(zhuǎn)化為業(yè)務(wù)上下文

若要通知一個(gè)應(yīng)用程序特有的問(wèn)題,有必要將應(yīng)用程序轉(zhuǎn)換為不同形式。若用業(yè)務(wù)特定狀態(tài)表示異常,則代碼更易維護(hù)。從某種意義上講,無(wú)論何時(shí)將異常傳到不同上下文(即另一技術(shù)層),都應(yīng)將異常轉(zhuǎn)換為對(duì)新上下文有意義的形式。

Java 異常處理的忌諱

一般不要忽略異常

在異常處理塊中,一項(xiàng)最危險(xiǎn)的舉動(dòng)是“不加通告”地處理異常。如下例所示:

  1. try{  
  2.     Class.forName("business.domain.Customer");  
  3. }  
  4. catch (ClassNotFoundException exc){}  

經(jīng)常能夠在代碼塊中看到類(lèi)似的代碼塊。有人總喜歡在編寫(xiě)代碼時(shí)簡(jiǎn)單快速地編寫(xiě)空處理器塊,并“自我安慰地”宣稱(chēng)準(zhǔn)備在“后期”添加恢復(fù)代碼,但這個(gè)“后期”變成了“無(wú)期”。

這種做法有什么壞處?如果異常對(duì)應(yīng)用程序的其他部分確實(shí)沒(méi)有任何負(fù)面影響,這未嘗不可。但事實(shí)往往并非如此,異常會(huì)擾亂應(yīng)用程序的狀態(tài)。此時(shí),這樣的代碼無(wú)異于掩耳盜鈴。

這種做法若影響較輕,則應(yīng)用程序可能出現(xiàn)怪異行為。例如,應(yīng)用程序設(shè)置的一個(gè)值不見(jiàn)了, 或 GUI 失效。若問(wèn)題嚴(yán)重,則應(yīng)用程序可能會(huì)出現(xiàn)重大問(wèn)題,因?yàn)楫惓N从涗浽脊收宵c(diǎn),難以處理,如重復(fù)的 NullPointerExceptions。

如果采取措施,記錄了捕獲的異常,則不可能遇到這個(gè)問(wèn)題。實(shí)際上,除非確認(rèn)異常對(duì)代碼其余部分絕無(wú)影響,至少也要作記錄。進(jìn)一步講,永遠(yuǎn)不要忽略問(wèn)題;否則,風(fēng)險(xiǎn)很大,在后期會(huì)引發(fā)難以預(yù)料的后果。

不要使用覆蓋式異常處理塊

另一個(gè)危險(xiǎn)的處理是覆蓋式處理器(blanket handler)。該代碼的基本結(jié)構(gòu)如下:

  1. try{  
  2.   // …  
  3. }  
  4. catch(Exception e){  
  5.   // …  
  6. }  

使用覆蓋式異常處理塊有兩個(gè)前提之一:

1. 代碼中只有一類(lèi)問(wèn)題。

這可能正確,但即便如此,也不應(yīng)使用覆蓋式異常處理,捕獲更具體的異常形式有利物弊。

2. 單個(gè)恢復(fù)操作始終適用。

這幾乎絕對(duì)錯(cuò)誤。幾乎沒(méi)有哪個(gè)方法能放之四海而皆準(zhǔn),能應(yīng)對(duì)出現(xiàn)的任何問(wèn)題。

分析下這樣編寫(xiě)代碼將發(fā)生的情況。只要方法不斷拋出預(yù)期的異常集,則一切正常。但是,如果拋出了未預(yù)料到的異常,則無(wú)法看到要采取的操作。當(dāng)覆蓋式處理器對(duì)新異常類(lèi)執(zhí)行千篇一律的任務(wù)時(shí),只能間接看到異常的處理結(jié)果。如果代碼沒(méi)有打印或記錄語(yǔ)句,則根本看不到結(jié)果。

更糟糕的是,當(dāng)代碼發(fā)生變化時(shí),覆蓋式處理器將繼續(xù)作用于所有新異常類(lèi)型,并以相同方式處理所有類(lèi)型。

一般不要把特定的異常轉(zhuǎn)化為更通用的異常

將特定的異常轉(zhuǎn)換為更通用異常時(shí)一種錯(cuò)誤做法。一般而言,這將取消異常起初拋出時(shí)產(chǎn)生的上下文,在將異常傳到系統(tǒng)的其他位置時(shí),將更難處理。見(jiàn)下例:

  1. try{  
  2.   // Error-prone code  
  3. }  
  4. catch(IOException e){  
  5.    String msg = "If you didn ’ t have a problem before,you do now!";  
  6.    throw new Exception(msg);  
  7. }  

因?yàn)闆](méi)有原始異常的信息,所以處理器塊無(wú)法確定問(wèn)題的起因,也不知道如何更正問(wèn)題。

不要處理能夠避免的異常

對(duì)于有些異常類(lèi)型,實(shí)際上根本不必處理。通常運(yùn)行時(shí)異常屬于此類(lèi)范疇。在處理空指針或者數(shù)據(jù)索引等問(wèn)題時(shí),不必求助于異常處理。

Java 異常處理的應(yīng)用實(shí)例

在定義銀行類(lèi)時(shí),若取錢(qián)數(shù)大于余額時(shí)需要做異常處理。

定義一個(gè)異常類(lèi) insufficientFundsException。取錢(qián)(withdrawal)方法中可能產(chǎn)生異常,條件是余額小于取額。

處理異常在調(diào)用 withdrawal 的時(shí)候,因此 withdrawal 方法要聲明拋出異常,由上一級(jí)方法調(diào)用。

異常類(lèi):

  1. class InsufficientFundsExceptionextends Exception{  
  2.    private Bank  excepbank;      // 銀行對(duì)象  
  3.    private double excepAmount;   // 要取的錢(qián)  
  4.    InsufficientFundsException(Bank ba, double  dAmount)  
  5.     {  excepbank=ba;  
  6.        excepAmount=dAmount;  
  7.    }  
  8.    public String excepMessage(){  
  9.       String  str="The balance is"+excepbank.balance  
  10.        + "\n"+"The withdrawal was"+excepAmount;  
  11.       return str;    
  12.    }  
  13. }// 異常類(lèi)  
  14.  

銀行類(lèi):

  1. class Bank{  
  2.    double balance;// 存款數(shù)  
  3.    Bank(double  balance){this.balance=balance;}  
  4.    public void deposite(double dAmount){  
  5.      if(dAmount>0.0) balance+=dAmount;  
  6.    }  
  7.    public void withdrawal(double dAmount)  
  8.                throws  InsufficientFundsException{  
  9.      if (balance<dAmount)     throw new  
  10.           InsufficientFundsException(this, dAmount);  
  11.       balancebalance=balance-dAmount;  
  12.    }  
  13.    public void showBalance(){  
  14.       System.out.println("The balance is "+(int)balance);  
  15.    }  
  16. }  
  17.  

前端調(diào)用:

  1. public class ExceptionDemo{  
  2.    public static void main(String args[]){  
  3.      try{  
  4.         Bank ba=new Bank(50);  
  5.           ba.withdrawal(100);  
  6.           System.out.println("Withdrawal successful!");  
  7.       }catch(InsufficientFundsException e) {   
  8.           System.out.println(e.toString());  
  9.           System.out.println(e.excepMessage());  
  10.       }  
  11.    }  
  12. }  
  13.  

總結(jié)

Java 異常處理是使用 Java 語(yǔ)言進(jìn)行軟件開(kāi)發(fā)和測(cè)試腳本開(kāi)發(fā)中非常重要的一個(gè)方面。對(duì)異常處理的重視會(huì)是您開(kāi)發(fā)出的代碼更健壯,更穩(wěn)定。本文系統(tǒng)的闡述了 Java 異常處理的原理和方法。能幫助讀者更加清楚的理解 Java 異常處理機(jī)制,在開(kāi)發(fā)代碼時(shí)更加靈活的使用它。

【編輯推薦】

  1. 全面掌握J(rèn)ava的異常處理機(jī)制  
  2. 初探Java 7異常處理功能增強(qiáng) 
  3. Java的異常處理機(jī)制 
責(zé)任編輯:佚名 來(lái)源: developerworks
相關(guān)推薦

2020-07-02 22:42:18

Java異常編程

2009-06-25 14:05:40

Java應(yīng)用技巧

2012-12-21 10:48:20

Java異常

2023-12-11 14:19:00

Java程序異常

2024-05-09 08:25:38

AndroidServiceLooper

2010-10-12 14:22:41

PHP異常機(jī)制

2018-08-20 16:25:48

編程語(yǔ)言Java異常處理

2010-03-10 13:59:40

Python異常處理

2009-08-25 13:48:01

Java EE架構(gòu)企業(yè)級(jí)應(yīng)用

2019-07-31 08:11:46

ACL訪問(wèn)控制列表網(wǎng)絡(luò)通信

2024-10-15 13:30:03

2012-11-19 14:29:38

JavaJava異常異常處理

2023-05-28 13:09:47

Java異常應(yīng)用

2011-07-05 10:20:38

java

2011-04-06 10:52:51

Java異常處理

2023-10-10 13:23:18

空指針異常Java

2013-08-22 17:10:09

.Net異常處理

2009-08-05 18:01:20

C#自定義異常處理

2023-06-15 14:09:00

解析器Servlet容器

2022-11-28 07:35:52

前端錯(cuò)誤
點(diǎn)贊
收藏

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

久本草在线中文字幕亚洲| 九色在线视频蝌蚪| 欧美三级第一页| 日韩av在线精品| 中文字幕国产免费| 毛片在线导航| 日本一区二区动态图| www国产亚洲精品| 波多野结衣高清视频| 欧美国产高潮xxxx1819| 亚洲免费电影一区| 手机看片国产精品| 亚洲四虎影院| 亚洲二区视频在线| 亚洲免费不卡| 免费福利在线视频| 风间由美一区二区三区在线观看| 国产精品96久久久久久又黄又硬 | 中文字幕乱码久久午夜不卡| 99在线免费观看视频| 在线观看黄色国产| 久久久久国产一区二区| 欧美精品九九久久| 永久免费看片视频教学| 久久av网址| 亚洲国产美女久久久久| 污污视频在线免费| 日韩城人网站| 欧洲精品一区二区三区在线观看| 水蜜桃色314在线观看| 国产黄色在线网站| 国产精品网站在线播放| 蜜桃麻豆www久久国产精品| 性猛交富婆╳xxx乱大交天津| 裸体一区二区三区| 国产精品久久久久久av| 无码人妻久久一区二区三区| 9色精品在线| 欧美精品xxx| 91精品国产高清一区二区三蜜臀| 99久久婷婷| 这里只有精品在线观看| 免费看黄色的视频| 国产亚洲一区二区三区不卡| 国产婷婷色综合av蜜臀av| 欧美无人区码suv| 91麻豆精品激情在线观看最新 | 一区二区三区欧美亚洲| 黄黄视频在线观看| 国产福利在线播放麻豆| 亚洲色图清纯唯美| 中文字幕精品在线播放| а√天堂资源地址在线下载| 亚洲免费视频中文字幕| 男同互操gay射视频在线看| 麻豆网在线观看| 亚洲乱码国产乱码精品精可以看 | 99在线视频观看| 中文字幕综合网| 老汉色影院首页| 五月天激情在线| 亚洲国产成人tv| 国模吧无码一区二区三区| 在线成人av观看| 欧洲人成人精品| 国产精欧美一区二区三区白种人| 欧洲大片精品免费永久看nba| 日韩视频一区在线观看| 韩国黄色一级片| 丝袜美腿综合| 中文国产亚洲喷潮| 久久国产波多野结衣| 欧美三级小说| 日本精品视频在线观看| 真实新婚偷拍xxxxx| 国产在线国偷精品免费看| 97视频资源在线观看| 亚洲欧美综合一区二区| 国产日本欧洲亚洲| 国产高清不卡无码视频| 伊人网在线播放| 欧美色综合网站| 亚洲三级在线视频| 三级精品视频| 日韩在线观看免费高清| 国产奶水涨喷在线播放| 日本美女一区二区| www.av一区视频| 美女做暖暖视频免费在线观看全部网址91| 国产精品素人一区二区| 996这里只有精品| 女生影院久久| 日韩一区二区电影网| 蜜桃传媒一区二区亚洲av| 欧美电影免费| 97涩涩爰在线观看亚洲| 国产一区二区在线播放视频| av在线这里只有精品| 亚洲精品久久久久久一区二区| а√天堂8资源在线官网| 色综合视频一区二区三区高清| 五月天丁香花婷婷| 欧美日本成人| 欧美精品激情视频| 91成品人影院| 久久久久久久久一| 黄色片免费在线观看视频| 在线免费日韩片| 精品欧美久久久| 激情无码人妻又粗又大| 中文日韩在线| 国产v亚洲v天堂无码| a中文在线播放| 婷婷国产在线综合| 九色91porny| 欧美日韩在线网站| 欧美做受高潮电影o| 精品人妻伦一区二区三区久久| 日本一区二区免费在线观看视频 | 日韩av高清| 国产亚av手机在线观看| 3d动漫精品啪啪1区2区免费| 中文字幕免费高清| 亚洲高清av| 99在线国产| 91国内在线| 777亚洲妇女| 成人网视频在线观看| 石原莉奈在线亚洲二区| 高清不卡日本v二区在线| 北岛玲日韩精品一区二区三区| 亚洲风情在线资源站| 三级av免费看| 欧美freesextv| 国产精品高潮呻吟久久av无限| 天堂中文在线官网| 亚洲午夜国产一区99re久久| 中文 日韩 欧美| 999精品一区| 91精品久久久久久久久中文字幕| а天堂8中文最新版在线官网| 欧美色视频日本版| 在线免费观看黄色小视频| 国产视频久久| 欧美日韩亚洲在线| 日韩精品一区二区三区| 亚洲人成网7777777国产| 日本天堂网在线| 91麻豆swag| aaaaaa亚洲| 国产一区日韩| 成人av资源在线播放| 麻豆av在线导航| 91精品国产高清一区二区三区蜜臀| 顶级黑人搡bbw搡bbbb搡| 国产专区综合网| 伊人再见免费在线观看高清版| 欧美成年网站| 欧美激情亚洲综合一区| 天天干天天做天天操| 欧美日韩综合视频网址| 日韩精品电影一区二区三区| 五月天网站亚洲| 在线日韩av永久免费观看| av成人在线观看| 日韩中文字幕在线免费观看| 国产视频在线观看视频| 一区二区三区在线观看免费视频| 国产精品一区二区av日韩在线| 国产精品18久久久久久麻辣| 成年人在线看| 91精品国产全国免费观看| 免费一区二区三区| 日本三级网站在线观看| 国产精品影视网| a级黄色小视频| 日韩av字幕| 国产精品狼人色视频一区| 免费黄网在线观看| 精品国产网站在线观看| 六月丁香在线视频| 日本一二三不卡| 无码人妻少妇色欲av一区二区| 亚洲日本国产| 神马影院午夜我不卡| 国产999精品在线观看| 国内精品视频久久| 午夜免费视频在线国产| 欧美sm美女调教| 国产午夜麻豆影院在线观看| 中文字幕一区在线观看视频| 亚洲成年人av| 日韩精品一区第一页| 黄色特一级视频| 黄色不卡一区| 国产精品日韩一区二区| jizz免费一区二区三区| 欧美激情精品久久久久久大尺度 | 国产精品原创视频| 免费91在线视频| 久久久久国产精品嫩草影院| 日韩视频在线你懂得| 成人毛片一区二区三区| 亚洲综合一区二区三区| 四虎成人免费影院| av综合在线播放| 日本亚洲一区二区三区| 日韩精品电影在线观看| av免费看网址| 最新国产精品| 一区不卡字幕| 国产在视频线精品视频www666| 99理论电影网| 亚洲精品777| 日本国产精品视频| 91精品国产黑色瑜伽裤| 超碰97人人做人人爱少妇| 国产在线高清| 亚洲精品电影网在线观看| 99在线精品视频免费观看软件| 日本大香伊一区二区三区| 国产精品成人免费一区二区视频| 亚洲人成亚洲人成在线观看图片| 成人午夜福利一区二区| 成人免费的视频| 精品人妻一区二区三| 青青草国产精品97视觉盛宴| 国产男女无遮挡| 亚洲精品偷拍| 丰满的少妇愉情hd高清果冻传媒| 欧美在线亚洲| 青青草原网站在线观看| 天天做天天爱综合| 一区二区三区观看| 久久中文亚洲字幕| 亚洲精品成人自拍| 日本不卡高清| 一本久道久久综合狠狠爱亚洲精品 | 亚洲成av人片在线观看无码| 波多野结衣家庭教师| 中文字幕亚洲一区二区av在线 | 久久发布国产伦子伦精品| 麻豆精品一区二区av白丝在线| 久久午夜夜伦鲁鲁一区二区| 久久久久久久高潮| 999精品视频在线| 日本在线观看不卡视频| 亚洲天堂av线| 麻豆专区一区二区三区四区五区| wwww.国产| 另类小说综合欧美亚洲| 中文字幕1234区| 国产一区二区精品久久| 韩国黄色一级片| 99re热视频精品| 性欧美一区二区| 中文字幕一区在线观看| 老女人性淫交视频| 亚洲国产综合91精品麻豆| 欧美一级视频免费观看| 欧美性猛交xxxx乱大交3| 波多野结衣视频免费观看| 在线一区二区视频| 国产裸体无遮挡| 精品国产91乱码一区二区三区 | 黄色片在线免费| 久久精品国产99国产精品| 手机在线国产视频| www.亚洲国产| 少妇愉情理伦三级| 一区二区三区欧美日| 国产一级做a爱片久久毛片a| 在线观看国产精品网站| 99久久国产免费| 亚洲国内精品视频| 在线观看美女网站大全免费| 久久av在线播放| 涩涩视频在线播放| 成人a视频在线观看| 美女视频免费精品| 色视频一区二区三区| 一区二区三区网站| 精品无码一区二区三区在线| 日韩av二区在线播放| 18深夜在线观看免费视频| 久久综合精品国产一区二区三区| 又色又爽的视频| 亚洲国产婷婷综合在线精品| 国产一级片av| 日韩美女视频在线| porn视频在线观看| 韩剧1988免费观看全集| 日韩久久99| 美女被啪啪一区二区| 在线看片不卡| 成人性视频欧美一区二区三区| 国产一区 二区 三区一级| 亚洲天堂网一区二区| 亚洲人一二三区| 少妇一级淫片日本| 91久久精品无码一区二区| 日韩电影中文字幕一区| 国产秀色在线www免费观看| 欧美一区二区影院| 日本在线一区二区三区| 亚州欧美一区三区三区在线| 亚洲青涩在线| 日本一二三区在线| 欧美韩国日本一区| 久久国产黄色片| 亚洲成av人乱码色午夜| 久久综合之合合综合久久| 欧美自拍视频在线| 草莓视频一区二区三区| 天天综合五月天| 全国精品久久少妇| 美女久久久久久久久久| 亚洲香蕉伊在人在线观| 97人人爽人人爽人人爽| 亚洲欧美一区二区三区在线| 蜜臀av在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 成人在线国产| 免费观看成人网| 91麻豆精东视频| 日韩美女视频网站| 亚洲成人精品久久久| 2020国产在线视频| 91亚洲精品一区二区| 天堂网在线观看国产精品| 91色国产在线| 亚洲国产岛国毛片在线| 波多野结衣人妻| 亚洲欧美日韩精品久久| 偷拍自拍在线看| 精品久久久久久综合日本| 亚洲精品社区| 色婷婷精品久久二区二区密| 亚洲成人一区在线| 日本成人动漫在线观看| 欧美精品久久久久久久久久| 白嫩白嫩国产精品| 我的公把我弄高潮了视频| youjizz久久| 精品国产一区二区三区四| 亚洲美女视频网站| 欧美日韩亚洲国产| 亚洲欧美一区二区原创| 久99久精品视频免费观看| 91嫩草丨国产丨精品| 欧美一区二区三区在线电影| 在线视频中文字幕第一页| 成人av资源网| 国产精品老牛| 国产调教在线观看| 欧美疯狂性受xxxxx喷水图片| 国产欧美黑人| 国产成人精品一区二区三区福利| 亚洲另类视频| 亚洲国产av一区| 欧美精品粉嫩高潮一区二区| av在线播放国产| 国产精品久久久久久久久久直播| 国产精品一二| 国产精品久久久久久成人| 在线不卡欧美精品一区二区三区| 91极品在线| 精品国产乱码久久久久久久软件| 老司机一区二区三区| 2017亚洲天堂| 欧美xxx久久| 欧美黑人粗大| 性做爰过程免费播放| 91www在线| 99久久伊人精品影院| 宅男噜噜噜66国产日韩在线观看| 亚洲乱码国产乱码精品精大量| 欧美在线观看你懂的| 超碰在线最新| 久久久久无码国产精品一区| 蜜乳av一区二区三区| 久久久久久久黄色| 亚洲精品午夜精品| 91麻豆精品| 国产乱子夫妻xx黑人xyx真爽| 国产精品久线观看视频| 日本高清视频免费看| 国产精品久久久久久久久久久久| 影视一区二区| 亚洲一区视频在线播放| 欧美一区二区三区婷婷月色 | 国产精品网址在线| 亚洲大胆在线| 国产人与禽zoz0性伦| 日韩av中文字幕在线| 韩国三级成人在线| 日韩精品一区二区三区色欲av| 亚洲蜜臀av乱码久久精品| 欧美女同网站| 国产精品果冻传媒潘|