1. 程式人生 > >Java的異常捕獲處理

Java的異常捕獲處理

異常處理機制

在編寫程式時,經常要在可能出現錯誤的地方加上檢測的程式碼,如進行x/y運算時,要檢測分母為0,資料為空,輸入的不是資料而是字元等。過多的分支會導致程式的程式碼加長,可讀性差。因此採用異常機制。

Java採用異常處理機制,將異常處理的程式程式碼集中在一起,與正常的程式程式碼分開,使得程式簡潔,並易於維護。

Java提供的是異常處理的抓拋模型

Java程式的執行過程中如出現異常,會生成一個異常類物件,該異常物件將被提交給Java執行時系統,這個過程稱為丟擲(throw)異常。

異常物件的生成

由虛擬機器自動生成:程式執行過程中,虛擬機器檢測到程式發生了問題,如果在當前程式碼中沒有找到相應的處理程式,就會在後臺自動建立一個對應異常類的例項物件並丟擲——自動丟擲。

由開發人員手動建立:Exception exception = new ClassCastException();——建立好的異常物件不丟擲對程式沒有任何影響,和建立一個普通物件一樣。

如果一個方法內丟擲異常,該異常物件會被拋給呼叫者方法中處理。如果異常沒有在呼叫者方法中處理,它繼續被拋給這個呼叫方法的上層方法。這個過程將一直繼續下去,直到異常被處理。這一過程稱為捕獲(catch)異常。

如果一個異常回到main()方法,並且main()也不處理,則程式執行終止。

程式設計師通常只能處理Exception,而對Error無能為力。

捕獲異常

使用 try 和 catch 關鍵字可以捕獲異常。try/catch 程式碼塊放在異常可能發生的地方。try/catch程式碼塊中的程式碼稱為保護程式碼。使用try/catch的語法如下:

try {
   // 程式程式碼
}catch(ExceptionName e) {
   //Catch 塊
}

try

捕獲異常的第一步是用try{…}語句塊選定捕獲異常的範圍,將可能出現異常的程式碼放在try語句塊中。

catch (Exceptiontype e)

Catch 語句包含要捕獲異常型別的宣告。當保護程式碼塊中發生一個異常時,try 後面的 catch 塊就會被檢查。如果發生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個引數到方法是一樣。

在catch語句塊中是對異常物件進行處理的程式碼。每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同型別的異常物件。

如果明確知道產生的是何種異常,可以用該異常類作為catch的引數,也可以用其父類作為catch的引數。比如:可以用ArithmeticException類作為引數的地方,就可以用RuntimeException類作為引數,或者用所有異常的父類Exception類作為引數。但不能是與ArithmeticException類無關的異常,如NullPointerException(catch中的語句將不會執行)。

捕獲異常的有關資訊:與其它物件一樣,可以訪問一個異常物件的成員變數或呼叫它的方法。

 getMessage()   獲取異常資訊,返回字串

 printStackTrace()  獲取異常類名和異常資訊,以及異常出現在程式中的位置。返回值void。

下面的例子中宣告有兩個元素的一個數組,當代碼試圖訪問陣列的第三個元素的時候就會丟擲一個異常。

import java.io.*;
public class ExcepTest{
   public static void main(String args[]){
      try{
         // 可能產生異常的程式碼,即需要被檢測的程式碼
         int a[] = new int[2];
         System.out.println("獲取陣列的第三個元素:" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){ // e用於接收try檢測到的異常物件
         System.out.println("丟擲的異常:" + e);
         System.out.println("message:"+e.getMessage()); // 獲取的是異常的資訊
         System.out.println("toString:"+e.toString()); // 獲取的是異常的名字+異常的資訊
         e.printStackTrace(); // 列印異常在堆疊中資訊;異常名稱+異常資訊+異常的位置
      }
      System.out.println("try/catch程式碼塊之後");
   }
}

執行結果為:

丟擲的異常:java.lang.ArrayIndexOutOfBoundsException: 3
message:3
toString:java.lang.ArrayIndexOutOfBoundsException: 3
java.lang.ArrayIndexOutOfBoundsException: 3
	at ExcepTest.main(ExcepTest.java:6)
try/catch程式碼塊之後

多重捕獲塊

一個 try 程式碼塊後面跟隨多個 catch 程式碼塊的情況就叫多重捕獲。

多重捕獲塊的語法如下所示:

try{
   // 程式程式碼
}catch(異常型別1 異常的變數名1){
  // 程式程式碼
}catch(異常型別2 異常的變數名2){
  // 程式程式碼
}catch(異常型別2 異常的變數名2){
  // 程式程式碼
}

上面的程式碼段包含了 3 個 catch塊。可以在 try 語句後面新增任意數量的 catch 塊。

如果保護程式碼中發生異常,異常被拋給第一個 catch 塊。如果丟擲異常的資料型別與  異常型別1  匹配,它在這裡就會被捕獲。如果不匹配,它會被傳遞給第二個 catch 塊。如此,直到異常被捕獲或者通過所有的 catch 塊。

try...catch...catch... 捕獲異常時,大的異常(Exception類)放在下方,小的異常放在上方,否則,在異常捕獲時,小的異常將不能被捕獲,因為全在大的異常類中捕獲到。即如果多個 catch 塊中的異常出現繼承關係,父類異常 catch 塊放在最下面。

finally

finally 程式碼塊出現在 catch 程式碼塊最後,語法如下:

try{
  // 程式程式碼
}catch(異常型別1 異常的變數名1){
  // 程式程式碼
}catch(異常型別2 異常的變數名2){
  // 程式程式碼
}finally{ 
  // 程式程式碼
}

捕獲異常的最後一步是通過finally語句為異常處理提供一個統一的出口,使得在控制流轉到程式的其它部分以前,能夠對程式的狀態作統一的管理。

不論在try程式碼塊中是否發生了異常事件,catch語句是否執行,catch語句是否有異常,catch語句中是否有return,finally塊中的語句都會被執行。

finally主要用於關閉資源。無論是否發生異常,資源都必須進行關閉。只有在finally之前執行了System.exit(0); 從而退出jvm的這種情況下finally才不執行。

finally語句和catch語句是任選的。

import java.io.*;
public class ExcepTest{
   public static void main(String args[]){
      int a[] = new int[2]; 
      try{
         // 可能產生異常的程式碼,即需要被檢測的程式碼
         System.out.println("獲取陣列的第三個元素:" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){ // e用於接收try檢測到的異常物件
         System.out.println("丟擲的異常:" + e);
      }finally{ // finally 關鍵字用來建立在 try 程式碼塊後面執行的程式碼塊。
         a[0] = 6;
         System.out.println("陣列第一個元素的值:" +a[0]);
      }
   }
}

執行結果:

丟擲的異常:java.lang.ArrayIndexOutOfBoundsException: 3
陣列第一個元素的值:6

finally 程式碼塊和 finalize()方法有什麼區別?

無論是否丟擲異常, finally 程式碼塊都會執行,它主要是用來釋放應用佔用的資源。 finalize()方法是 Object 類的一個 protected 方法,它是在物件被垃圾回收之前由 Java 虛擬機器來呼叫的。

使用異常捕獲時注意下面幾個事項:

1)catch 不能獨立於 try 存在。

2)在 try/catch 後面新增 finally 塊並非強制性要求的。

3)try 程式碼後不能既沒 catch 塊也沒 finally 塊。

4)try, catch, finally 塊之間不能新增任何程式碼。

不捕獲異常時的情況

前面使用的異常都是RuntimeException類或是它的子類,這些類的異常的特點是:即使沒有使用try和catch捕獲,Java自己也能捕獲,並且編譯通過 ( 但執行時會發生異常使得程式執行終止 )。

如果丟擲的異常是IOException等型別的非執行時異常,則必須捕獲,否則編譯錯誤。也就是說,我們必須處理編譯時異常,將異常進行捕捉,轉化為執行時異常。

注意:    

1)異常處理完成以後,Exception物件會在下一個垃圾回收過程中被回收掉。

2)Java 語言定義了一些異常類在 java.lang 標準包中。標準執行時異常類的子類是最常見的異常類。由於 java.lang 包是預設載入到所有的 Java 程式的,所以大部分從執行時異常類繼承而來的異常都可以直接使用。

相關推薦

Java異常捕獲處理機制

在Java中,異常情況分為Exception(異常)和Error(錯誤)兩大類,Java異常通常是指程式執行過程中出現的非正常情況,如使用者輸入錯誤、除數為零、需要處理的檔案不存在、陣列下標越界等,對於異常情況的出現,可以採用異常處理,以保證程式可以正常的執行。 Java中定義兩種型別的異常和錯

Java異常捕獲處理

異常處理機制 在編寫程式時,經常要在可能出現錯誤的地方加上檢測的程式碼,如進行x/y運算時,要檢測分母為0,資料為空,輸入的不是資料而是字元等。過多的分支會導致程式的程式碼加長,可讀性差。因此採用異常機制。 Java採用異常處理機制,將異常處理的程式程式碼集中在一起,與正

java/spring scheduler 異常捕獲處理

由於java的異常會導致執行緒被打斷,因此任務的異常是被任務工作執行緒捕獲的。 若需要對任務執行情異常捕獲可以這樣操作: ScheduledExecutorService scheduler = Executors.newSingleThreadSche

Java異常捕獲之一道try-catch-finally語句題

span pri div system 處理機 out nal exception for 今天,學習了try-catch-finally語句,本來覺得蠻簡單、易懂的。搜了一道相關類型的題。結果信心被潑了盆冷水。先把題Mark一下,出去透透風。 1 public cla

java異常——捕獲異常+再次拋出異常異常

init fileinput 代碼塊 演示 建議 實例 ssa ack 拋出異常 【0】README 0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java異常——捕獲異常+再次拋出異常與異常鏈

java異常統一處理

出現 actor 錯誤 統一處理 type .get 。。 cfa getc 一般系統拋出的錯誤不含錯誤代碼,出去部分的404,500,400之外,我們如果想吧錯誤代碼定義的更細致,就需要自己繼承RuntimeExeption這個類後,重新定義構造方法定義自己的錯誤信息。

java異常(Exception)處理機制詳解

java異常(Exception)處理機制詳解 目錄 一. 異常的定義  二. 異常掃盲行動  三. 異常的使用 例1. 這個例子主要通過兩個方法對比來演示一下有了異常以後程式碼的執行流程。 例2. 重新丟擲異常 例3. 異常鏈的使用及異常丟失 例

java異常情況處理

關於異常的全部說明,在api裡都可以查閱。 算術異常類:ArithmeticExecption 空指標異常類:NullPointerException 型別強制轉換異常:ClassCastException 陣列負下標異常:NegativeArrayException 陣列下標越界異常:ArrayI

SpringBoot全域性異常捕獲處理(包括自定義異常捕獲處理

在做專案的時候需要對自定義異常做捕獲和處理,現在將程式碼記錄下來便於以後查閱。 1、全域性異常捕捉處理 @ControllerAdvice( annotations = {RestController.class} ) public class ExceptionHandlerAdv

全域性異常捕獲處理

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.exception.ExceptionUt

java異常處理

轉載請標明文章的原出處 Java提高篇——Java 異常處理 異常的概念 異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。 比如說,你的程式碼少了一個分號,那麼執行出來結果是提示是錯誤java.lang.Error;如果你用Syst

Java異常捕獲相關

異常的產生     異常是程式之中導致程式中斷的一種指令流,異常一旦出現並且沒有進行合理處理的話,那麼程式就將中斷執行。 我們要做的是即使程式出現了異常,也要讓程式在可控範圍內正確的執行完畢。 Java異常類繼承結構        Java所有的異常型

JVM對Java異常處理原理

最初我們用 Java 寫 JSP 的時候,幾乎可以不觸及異常,因為 Servlet 容器會把 API 丟擲的異常包裝成 ServletException 丟給容器去處理。再後來應用分層,程式碼中要處理的異常便多了,一般會轉換成自定義的業務異常類,用 try-catch-t

JVM 對Java異常處理原理

來看看上面程式碼中的 transfer() 方法相應的位元組碼指令,編譯器是 Eclipse 3.3.2 的,它所用的 JDK 是 1.6.0_06,編譯相容級別設定為 6.0。用命令 javap -c com.unmi.AboutCatch 在 Dos 視窗中就能輸出: public static voi

Java異常處理機制

Java的異常層次體系 Java的所有異常物件都派生自Throwable類,下層有兩個分支:error和exception。 Error分支描述Java執行時系統內部錯誤或資源耗盡錯誤,遇到派生自Error的錯誤,程式除了通告給使用者並儘量安全退出外也無能為力。 Exception分支才是程式設計師主要在

Wpf 全域性異常捕獲處理

public App() { //UI執行緒異常 this.DispatcherUnhandledException += App_DispatcherUnhandledException; //非UI執行緒異常

JEECG&JWT異常捕獲強化處理 | Java: Meaning of catch (final SomeException e)?

//從header中得到token String authHeader = request.getHeader(JwtConstants.AUTHORIZATION); if (authHeader == null) { th

【mysql+java捕獲資料庫中未查到資料進行異常處理

文章目錄前言準備工作 思路分析流程圖分析程式碼分析說明 捕獲資料庫未查到資料異常處理 前言         當用戶查資料庫中的表單以此驗證表單中是否和即將要插入的資料重複,捕獲重複的資料以此來統計重複資

java異常捕獲處理

異常的捕獲及處理 1.try……catch…… 2.throws 3.throw 4.assert 斷言 First、什麼是異常? 異常是導致一個程式中斷的指令流,一旦出現之後程式就將立即退出。 public class ExpTest{ pu

Java 異常捕獲處理詳解(二)

上一篇Java 異常的捕獲與處理詳解(一)講了異常的產生、處理以及處理流程,接下來講其他內容。 一、throws關鍵字 thrwos關鍵字主要是在方法定義上使用的,表示的是此方法之中不進行異常的處理,而交給被呼叫處處理。 例如: class MyMath