首頁 >Java >java教程 >什麼是java異常? java異常是如何處理的?

什麼是java異常? java異常是如何處理的?

青灯夜游
青灯夜游轉載
2018-10-19 18:01:445270瀏覽

本篇文章帶給大家的內容是介紹什麼是java異常? java異常是如何處理的?有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。

一、JAVA異常

異常是指不期而至的各種情況,如:檔案找不到、網路連線失敗、非法參數等。異常是一個事件,它發生在程式運作期間,幹擾了正常的指令流程。 Java透過API中的Throwable類別的眾多子類別描述各種不同的異常。因而,Java異常都是對象,是Throwable子類別的實例,描述了出​​現在一段編碼中的錯誤條件。當條件生成時,錯誤將引發異常。

Java異常類別層次結構圖:

什麼是java異常? java異常是如何處理的?

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

     Error(錯誤):#是程式無法處理的錯誤,表示執行應用程式中較嚴重問題。大多數錯誤與程式碼編寫者執行的操作無關,而表示程式碼執行時期 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機器運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的記憶體資源時,就會出現 OutOfMemoryError。這些異常發生時,Java虛擬機器(JVM)一般會選擇執行緒終止。

Exception(例外):是程式本身可以處理的例外。

Java的異常(包括Exception和Error)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)#。

可查異常(編譯器要求必須處置的異常):正確的程式在運作中,很容易出現的、情理可容的異常狀況。可查異常雖然是異常狀況,但在某種程度上它的發生是可以預期的,而且一旦發生這種異常狀況,就必須採取某種方式進行處理。

除了RuntimeException及其子類別以外,其他的Exception類別及其子類別都屬於可查例外。 這種異常的特徵是Java編譯器會檢查它,也就是說,當程式中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,否則編譯不會通過。

 不可查異常(編譯器不要求強制處置的異常):包含執行時期異常(RuntimeException與其子類別)和錯誤(Error)。

 附註:異常能被程式本身可以處理,錯誤是無法處理。

Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。 程式中應盡可能去處理這些異常。

執行階段異常:都是RuntimeException類別及其子類別異常,如NullPointerException(空指標例外)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度盡可能避免這類異常的發生。

執行時期異常的特點是Java編譯器不會檢查它,也就是說,當程式中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。

非執行時期異常 (編譯異常):是RuntimeException以外的例外,類型上都屬於Exception類別及其子類別。從程式語法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如IOException、SQLException等以及使用者自訂的Exception異常,一般情況下不自訂檢查異常。

二、處理例外的機制

#在Java 應用程式中,例外處理機制為:拋出例外,捕捉異常。

 拋出例外  : 當一個方法出現錯誤引發例外狀況時,方法建立例外物件並交付執行時系統,異常物件中包含了異常類型和異常出現時的異常狀態等資訊。運行時系統負責尋找處置異常的程式碼並執行。

捕獲異常:在方法拋出異常後,運行時系統將轉為尋找合適的異常處理器(exception handler).潛在的異常處理器是異常發生時依序存留在呼叫棧中的方法集合。當異常處理器,能處理的異常類型與方法拋出的異常類型相符時,即為合適的異常處理器。運行時系統從發生異常的方法開始,依序回查呼叫堆疊中的方法,直到找到含有合適異常處理器的方法並執行。當運行時系統遍歷呼叫堆疊而未找到合適 的異常處理器,則運行時系統終止。同時,意味著java程式終止。

由於運行時異常的不可查性,為了更合理、更容易實現應用程序,Java規定,運行時異常將由Java運行時系統自動拋出,允許應用程式忽略運行時異常。

方法運行中可能出現的Error,當運行方法不欲捕捉時,Java允許該方法不做任何拋出聲明。因為,大多數Error異常屬於永遠不能被允許發生的狀況,也屬於合理的應用程式不該捕捉的異常。

對於所有的可查異常,Java規定:一個方法必須捕捉,或宣告拋出方法之外。也就是說,當一個方法選擇不捕捉可查異常時,它必須聲明將拋出異常。

 整體來說,Java規定:對於可查異常必須捕捉、或宣告拋出。允許忽略不可查的RuntimeException和Error。

三、捕獲異常:try、catch 與finally

##1.try-catch語句

什麼是java異常? java異常是如何處理的?

#關鍵字try後面的一對大括號將一塊可能發生異常的程式碼包起來,稱為監控區域。 Java方法在運行過程中出現異常,則建立異常物件。將異常拋出監控區域之 外,由Java運行時系統試圖尋找匹配的catch子句以捕獲異常。若有符合的catch子句,則執行其異常處理程式碼,try-catch語句結束。程序繼續執行。

 匹配的原則是:如果拋出的異常物件屬於catch子句的異常類,或者屬於該異常類的子類,則認為產生的異常物件與catch塊捕獲的異常類型相符。

不捕捉、也不宣告拋出執行時期例外。 程式將會拋出異常,運作結束。

什麼是java異常? java異常是如何處理的?

一旦某個catch捕捉到符合的例外類型,就會進入異常處理程式碼。一經處理結束,就表示整個try-catch語句結束。其他的catch子句不再有匹配和捕捉異常類型的機會。應該盡量將捕獲底層異常類的catch子 句放在前面,同時盡量將捕獲相對高層的異常類的catch子句放在後面。否則,捕獲底層異常類別的catch子句將可能會被屏蔽。

2.try-catch-finally

#try-catch語句也可以包含第三部分,就是finally子句。它表示無論是否出現異常,都應執行的內容。 try-catch-finally語句的一般語法形式為:

什麼是java異常? java異常是如何處理的?

#try 區塊:用於擷取例外。其後可接零個或多個catch區塊,如果沒有catch區塊,則必須跟一個finally區塊。

catch 區塊:用於處理try捕獲到的例外。

finally 區塊:無論是否捕獲或處理異常,finally區塊裡的語句都會被執行。當在try區塊或catch區塊中遇到return語句時,finally語句區塊將在方法回傳之前執行。在以下4種特殊情況下,finally區塊不會被執行:

1)在finally語句區塊中發生了異常。

2)在前面的程式碼中用了System.exit()退出程式。
3)程式所在的執行緒死亡。
4)關閉CPU。

3. try-catch-finally 規則(異常處理語句的語法規則):

1)  必須在try 之後新增catch 或finally 區塊。 try 區塊後可同時接 catch 和 finally 區塊,但至少有一個區塊。

2) 必須遵循區塊順序:若程式碼同時使用 catch 和 finally 區塊,則必須將 catch 區塊放在 try 區塊之後。

3) catch 區塊與對應的異常類別的類型相關。

4) 一個 try 區塊可能有多個 catch 區塊。若如此,則執行第一個匹配區塊。即Java虛擬機會把實際拋出的異常物件依次和各個catch程式碼區塊聲明的異常類型匹配,如果異常物件為某個異常類型或其子類別的實例,就執行這個catch程式碼區塊,不會再執行其他的catch程式碼區塊

5) 可嵌套try-catch-finally 結構。

6) 在 try-catch-finally 結構中,可重新拋出例外。
7) 除了下列情況,總是會執行finally 做為結束:JVM 過早終止(呼叫System.exit(int));在finally 區塊中拋出一個未處理的例外;電腦斷電、失火、或遭遇病毒攻擊。

四、try、catch、finally語句區塊的執行順序:

1)當try沒有捕捉到異常時:try語句區塊中的語句逐一被執行,程式將跳過catch語句區塊,執行finally語句區塊和其後的語句;

2)當try捕獲到異常,catch語句區塊裡沒有處理此異常的情況:當try語句區塊裡的某條語句出現異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句區塊裡的語句還是會被執行,但finally語句區塊後的語句不會被執行;

#3)當try捕獲到異常,catch語句區塊裡有處理此異常的情況:在try語句區塊中是按照順序來執行的,當執行到某一條語句出現異常時,程序將跳到catch語句塊,並與catch語句塊逐一匹配,找到與之對應的處理程序,其他的catch語句塊將不會被執行,而try語句區塊中,出現異常之後的語句也不會被執行,catch語句區塊執行完後,執行finally語句區塊裡的語句,最後執行finally語句區塊後的語句;

#圖示try、catch、finally語句區塊的執行:

什麼是java異常? java異常是如何處理的?

五、拋出異常

任何Java程式碼都可以拋出異常,如:自己寫的程式碼、來自Java開發環境包中程式碼,或是Java執行時間系統。無論是誰,都可以透過Java的throw語句拋出異常。從方法中拋出的任何異常都必須使用throws子句。

1. throws拋出異常

如果一個方法可能會出現異常,但沒有能力處理這種異常,可以在方法聲明處用throws子句聲明拋出異常。

什麼是java異常? java異常是如何處理的?

方法名稱後的throws Exception1,Exception2,...,ExceptionN 為宣告要拋出的例外清單。當方法拋出異常列表的異常時,方法將不對這些類型及其子類別類型的異常作處理,而拋向調用該方法的方法,由他去處理。

Throws拋出異常的規則:

1) 如果是不可查異常(unchecked exception),即Error、RuntimeException或它們的子類,那麼可以不使用throws關鍵字來聲明要拋出的異常,編譯仍能順利通過,但在運行時會被系統拋出。

2)必須宣告方法可拋出的任何可查例外(checked exception)。即如果一個方法可能出現受可查異常,要么用try-catch語句捕獲,要么用throws子句聲明將它拋出,否則會導致編譯錯誤 

3)僅當拋出了異常,該方法的呼叫者才必須處理或重新拋出該異常。當方法的呼叫者無力處理該異常的時候,應該繼續拋出.

4)呼叫方法必須遵循任何可查異常的處理和聲明規則。若覆寫一個方法,則不能聲明與覆蓋方法不同的異常。聲明的任何異常必須是被覆寫方法所聲明異常的同類或子類別。

判斷一個方法可能會出現例外的依據如下:

1)#方法中有throw語句。

2)呼叫了其他方法,其他方法用throws子句宣告拋出某種例外。

如果所有方法都層層上拋獲取的異常,最終JVM會進行處理,處理也很簡單,就是列印例外訊息和堆疊資訊。如果拋出的是Error或RuntimeException,則該方法的呼叫者可選擇處理該例外狀況。

2. Throwable類別中的常用方法

## getCause():回傳拋出異常的原因。如果 cause 不存在或未知,則傳回 null。

getMeage():傳回異常的訊息訊息。

printStackTrace():物件的堆疊追蹤輸出至錯誤輸出流,作為欄位 System.err 的值。

六、java常見異常

在Java中提供了一些異常用來描述經常發生的錯誤,對於這些異常,有的需要程式設計師進行捕獲處理或聲明拋出,有的是由Java虛擬機自動進行捕獲處理。 Java中常見的異常類別:

1. runtimeException子類別:(非檢查例外)##     

  •  java.lang.ArrayIndexOutOfBoundsException

    陣列索引越界例外。當數組的索引值為負數或大於等於數組大小時拋出。

  • java.lang.ArithmeticException

    算術條件異常。譬如:整數除零等。

  • java.lang.NullPointerException

    空指標例外。當應用程式試圖在要求使用物件的地方使用了null時,拋出該異常。譬如:呼叫null物件的實例方法、存取null物件的屬性、計算null物件的長度、使用throw語句拋出null等等

  • java.lang.ClassNotFoundException

    找不到類異常。當應用程式試圖根據字串形式的類別名稱構造類,而在遍歷CLASSPAH之後找不到對應名稱的class檔案時,拋出該異常。

  • java.lang.NegativeArraySizeException  數組長度為負異常

  • java.lang.ArrayStoreException 數組中包含不相容的值拋出的異常

  • java.lang.SecurityException 安全性例外

2.IOException(已檢查異常)

#IOException:操作輸入流和輸出流時可能出現的異常。

EOFException   檔案已結束異常 

FileNotFoundException   檔案未找到異常

3.其他

ClassCastException類型轉換例外類別

ArrayStoreException  數組中包含不相容的值拋出的例外

SQLException   操作資料庫異常類別

NoSuchFieldException   欄位未找到例外狀況

NoSuchFieldException   欄位未找到例外狀況

## NoSuchMethodException   方法找不到拋出的例外

NumberFormatException    字串轉換為數字拋出的例外

StringIndexOutOfBoundsException 字串索引超出範圍拋出的例外狀況

## IllegalAccess某一類別例外

InstantiationException  當應用程式試圖使用Class類別中的newInstance()方法建立一個類別的實例,而指定的類別物件無法被實例化時,拋出該例外狀況

4.自訂異常

使用Java內建的異常類別可以描述在程式設計時出現的大部分異常情況。除此之外,用戶還可以自訂異常。使用者自訂異常類,只需繼承Exception類別即可。
 在程式中使用自訂異常類,大體可分為以下幾個步驟。
(1)建立自訂異常類別。
(2)在方法中透過throw關鍵字拋出異常物件。
(3)如果在目前拋出異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的聲明處透過throws關鍵字指明要拋出給方法呼叫者的異常,繼續進行下一步操作。
(4)在出現異常方法的呼叫者中捕獲並處理異常。

總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。更多相關教學請造訪Java影片教學java開發圖文教學bootstrap影片教學

以上是什麼是java異常? java異常是如何處理的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除