摘要:異常也就是指程序運行時發生錯誤,而異常處理就是對這些錯誤進行處理和控制。有兩個重要的子類異常和錯誤,二者都是異常處理的重要子類,各自都包含大量子類。需要注意的是,一旦某個捕獲到匹配的異常類型,將進入異常處理代碼。
1,異常現象
程序錯誤分為三種:1,編譯錯誤;2,運行時錯誤;3,邏輯錯誤。 編譯錯誤是因為程序沒有遵循語法規則,編譯程序能夠自己發現并且提示我們錯誤的原因和位置,這個也是大家在剛接觸編程語言最常遇到的問題。 運行時錯誤是因為程序在執行時,運行環境發現了不能執行的操作。 邏輯錯誤是因為程序沒有按照預期的邏輯順序執行。異常也就是指程序運行時發生錯誤,而異常處理就是對這些錯誤進行處理和控制。2,java異常類
Java異常類層次結構圖:
在 Java 中,所有的異常都有一個共同的祖先java.lang包中的 **Throwable類**。Throwable: 有兩個重要的子類:**Exception(異常)**和 **Error(錯誤)**,二者都是 Java 異常處理的重要子類,各自都包含大量子類。
Error(錯誤):是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。
這些錯誤表示故障發生于虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等。這些錯誤是不可查的,因為它們在應用程序的控制和處理能力之 外,而且絕大多數是程序運行時不允許出現的狀況。對于設計合理的應用程序來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。在 Java中,錯誤通過Error的子類描述。
Exception(異常):是程序本身可以處理的異常。Exception 類有一個重要的子類 RuntimeException。RuntimeException 異常由Java虛擬機拋出。NullPointerException(要訪問的變量沒有引用任何對象時,拋出該異常)、ArithmeticException(算術運算異常,一個整數除以0時,拋出該異常)和 ArrayIndexOutOfBoundsException (下標越界異常)。
注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
通常,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異常,一般情況下不自定義檢查異常。
Trowable類常用方法:public string getMessage():返回異常發生時的詳細信息
public string toString():返回異常發生時的簡要描述
public string getLocalizedMessage():返回異常對象的本地化信息。使用Throwable的子類覆蓋這個方法,可以聲稱本地化信息。如果子類沒有覆蓋該方法,則該方法返回的信息與getMessage()返回的結果相同
public void printStackTrace():在控制臺上打印Throwable對象封裝的異常信息
1、 java.lang.ArrayIndexOutOfBoundsException 數組索引越界異常。當對數組的索引值為負數或大于等于數組大小時拋出。 2、java.lang.ArithmeticException 算術條件異常。譬如:整數除零等。 3、java.lang.NullPointerException 空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等 4、java.lang.ClassNotFoundException 找不到類異常。當應用試圖根據字符串形式的類名構造類,而在遍歷CLASSPAH之后找不到對應名稱的class文件時,拋出該異常。 5、java.lang.NegativeArraySizeException 數組長度為負異常 6、java.lang.ArrayStoreException 數組中包含不兼容的值拋出的異常 7、java.lang.SecurityException 安全性異常 8、java.lang.IllegalArgumentException 非法參數異常2.IOException
IOException:操作輸入流和輸出流時可能出現的異常。 EOFException 文件已結束異常 FileNotFoundException 文件未找到異常
ClassCastException 類型轉換異常類 ArrayStoreException 數組中包含不兼容的值拋出的異常 SQLException 操作數據庫異常類 NoSuchFieldException 字段未找到異常 NoSuchMethodException 方法未找到拋出的異常 NumberFormatException 字符串轉換為數字拋出的異常 StringIndexOutOfBoundsException 字符串索引超出范圍拋出的異常 IllegalAccessException 不允許訪問某類異常 InstantiationException 當應用程序試圖使用Class類中的newInstance()方法創建一個類的實例,而指定的類對象無法被實例化時,拋出該異常3,異常處理方法
在 Java 應用程序中,異常處理機制為:拋出異常,捕捉異常。
1,聲明和拋出異常任何代碼都有可能發生系統錯誤(Error)和運行時錯誤(RunrimeException),因此在方法聲明時,Java系統不要求顯示的聲明Error和RuntimeException兩種異常類(系統隱含的聲明了這兩種異常類),但是,可以在方法體中拋出這兩種異常對象。需要注意的是:如果要在方法體中拋出其它異常,必須在方法頭聲明這種異常類。
,聲明異常類的格式:
在方法頭中使用throws關鍵字,例如:
public void myThod throws IOException //這里聲明的異常類是:IOException.
關鍵字throws指出方法myThod在執行時可能拋出IOException異常(對象)。如果方法執行時可能拋出多種異常,就可以像實現多個接口的一樣,將異常類之間用逗號隔開,例如:
public void myThod throws Exception1, Exception2....... ExceptionnN
拋出異常對象的格式
在方法頭中聲明了異常類后,就應該在方法體中拋出一個與方法頭名中聲明的異常類相一致的對象。例如:
Throw new TheException();//拋出異常
或
TheException ex=new TheException();
Throw ex;//拋出異常對象ex
注意:聲明異常類的關鍵字是throws,拋出異常對象的關鍵字是throw
try { // 可能會發生異常的程序代碼 } catch (Type1 id1){ // 捕獲并處置try拋出的異常類型Type1 } catch (Type2 id2){ //捕獲并處置try拋出的異常類型Type2 }
注意一個try語句后面可以跟很多catch語句,catch語句被稱為異常處理器。關鍵詞try后的一對大括號將一塊可能發生異常的代碼包起來,稱為監控區域。Java方法在運行過程中出現異常,則創建異常對象。將異常拋出監控區域之 外,由Java運行時系統試圖尋找匹配的catch子句以捕獲異常。若有匹配的catch子句,則運行其異常處理代碼,try-catch語句結束。
匹配的原則是:如果拋出的異常對象屬于catch子句的異常類,或者屬于該異常類的子類,則認為生成的異常對象與catch塊捕獲的異常類型相匹配
例1 捕捉throw語句拋出的“除數為0”異常。
public class TestException { public static void main(String[] args) { int a = 6; int b = 0; try { // try監控區域 if (b == 0) throw new ArithmeticException(); // “除數為0”等ArithmeticException,是RuntimException的子類。而運行時異常將由運行時系統自動拋出,不需要使用throw語句,這里把throw new ArithmeticException()去掉也是不影響運行結果的。 System.out.println("a/b的值是:" + a / b); } catch (ArithmeticException e) { // catch捕捉異常 System.out.println("程序出現異常,變量b不能為0。"); } System.out.println("程序正常結束。"); } }
運行結果:
在例1中 try監控區域通過if語句進行判斷,當“除數為0”的錯誤條件成立時引發ArithmeticException異常,創建 ArithmeticException異常對象,并由throw語句將異常拋給Java運行時系統,由系統尋找匹配的異常處理器catch并運行相應異 常處理代碼,打印輸出“程序出現異常,變量b不能為0。”try-catch語句結束,繼續程序流程。 需要注意的是,一旦某個catch捕獲到匹配的異常類型,將進入異常處理代碼。一經處理結束,就意味著整個try-catch語句結束。其他的catch子句不再有匹配和捕獲異常類型的機會。
Java通過異常類描述異常類型,異常類的層次結構如圖1所示。對于有多個catch子句的異常程序而言,應該盡量將捕獲底層異常類的catch子 句放在前面,同時盡量將捕獲相對高層的異常類的catch子句放在后面。否則,捕獲底層異常類的catch子句將可能會被屏蔽。
RuntimeException異常類包括運行時各種常見的異常,ArithmeticException類和ArrayIndexOutOfBoundsException類都是它的子類。因此,RuntimeException異常類的catch子句應該放在 最后面,否則可能會屏蔽其后的特定異常處理或引起編譯錯誤。
2. try-catch-finally語句try-catch語句還可以包括第三部分,就是finally子句。它表示無論是否出現異常,都應當執行的內容。try-catch-finally語句的一般語法形式為:
try { // 可能會發生異常的程序代碼 } catch (Type1 id1) { // 捕獲并處理try拋出的異常類型Type1 } catch (Type2 id2) { // 捕獲并處理try拋出的異常類型Type2 } finally { // 無論是否發生異常,都將執行的語句塊 }
例二, 帶finally子句的異常處理程序
public class TestException { public static void main(String args[]) { int i = 0; String greetings[] = { " Hello world !", " Hello World !! ", " HELLO WORLD !!!" }; while (i < 4) { try { // 特別注意循環控制變量i的設計,避免造成無限循環 System.out.println(greetings[i++]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("數組下標越界異常"); } finally { System.out.println("--------------------------"); } } } }
運行結果:
try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。在以下4種特殊情況下,finally塊不會被執行:
1)在finally語句塊中發生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關閉CPU。
雖然Java系統已經預定義好了很多異常類,但是有時會遇到預定義的異常類不能描述出現的錯誤。在這種情況下,程序員可以通過擴展Exception類及其子類來定義自己的異常類
格式如下
class 異常類名 extends Exception { public 異常類名(String msg) { super(msg); } }2.標識可能拋出的異常:
throws 異常類名1,異常類名23.捕獲異常:
try{} catch(異常類名 y){} catch(異常類名 y){}4.方法解釋
getMessage() //輸出異常的信息
printStackTrace() //輸出導致異常更為詳細的信息
例子
CustomException.java
package me; class FormatException extends Exception { /** * */ private static final long serialVersionUID = 1L; private String ErrorMessage; public FormatException(String message) { super(message); ErrorMessage=message; } public String getMessage(){ return "該數組元素"+ErrorMessage+"不是偶數,不符合"; } } public class CustomException { int A[]={6,7,3,2,5,1}; public void g(int i)throws FormatException { System.out.println("一下輸出數組元素偶數"); for(i=0;i<=5;i++) { if(A[i]%2!=0) { throw new FormatException(String.valueOf(i)); } else System.out.println("A["+i+"]="+A[i]); } } public void run(int i){ try{ g(i); } catch(FormatException e) { e.getMessage();System.out.println(e); } finally{System.out.println("A["+i+"]="+A[i]); } } }
text.java
package me; public class Text { public static void main(String[] args) { CustomException a=new CustomException(); a.run(5); } }
運行結果:
歡迎關注我的微信公眾號:"Java面試通關手冊"(一個有溫度的微信公眾號,期待與你共同進步~~~堅持原創,分享美文,分享各種Java學習資源):
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69450.html
摘要:不受檢查異常為編譯器不要求強制處理的異常,檢查異常則是編譯器要求必須處置的異常。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當運行時系統遍歷調用棧而未找到合適的異常處理器,則運行時系統終止。異常處理涉及到五個關鍵字,分別是。 概念 程序運行時,發生的不被期望的事件,它阻止了程序按照程序員的預期正常執行,這就是異常。 異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并...
摘要:根據異常對象判斷是否存在異常處理。否則,范圍小的異常會因異常處理完成而無法處理。異常處理中使用作為異常的統一出口。 參考《第一行代碼java》《java程序設計教程》java中程序的錯誤有語法錯誤、語義錯誤。如果是語法性錯誤,在編譯時就可以檢查出來并解決。語義錯誤是在程序運行時出現的,在編譯時沒有錯誤,但在運行時可能會出現錯誤導致程序退出,這些錯誤稱為異常。在沒有異常處理的情況下,也即...
摘要:為可恢復的錯誤使用檢查型異常,為編程錯誤使用非檢查型錯誤。檢查型異常保證你對錯誤條件提供異常處理代碼,這是一種從語言到強制你編寫健壯的代碼的一種方式,但同時會引入大量雜亂的代碼并導致其不可讀。在編程中選擇檢查型異常還是運行時異常。 異常處理是Java 開發中的一個重要部分。它是關乎每個應用的一個非功能性需求,是為了處理任何錯誤狀況,比如資源不可訪問,非法輸入,空輸入等等。Java提供了...
閱讀 3256·2023-04-26 02:10
閱讀 2880·2021-10-12 10:12
閱讀 4557·2021-09-27 13:35
閱讀 1519·2019-08-30 15:55
閱讀 1058·2019-08-29 18:37
閱讀 3423·2019-08-28 17:51
閱讀 1954·2019-08-26 13:30
閱讀 1191·2019-08-26 12:09