摘要:根據異常對象判斷是否存在異常處理。否則,范圍小的異常會因異常處理完成而無法處理。異常處理中使用作為異常的統一出口。
參考《第一行代碼java》《java程序設計教程》
java中程序的錯誤有語法錯誤、語義錯誤。如果是語法性錯誤,在編譯時就可以檢查出來并解決。語義錯誤是在程序運行時出現的,在編譯時沒有錯誤,但在運行時可能會出現錯誤導致程序退出,這些錯誤稱為異常。在沒有異常處理的情況下,也即默認情況下,程序出現異常后會打印異常信息,同時終止執行異常之后的代碼。為了讓程序在出現異常后仍然可以正常執行完畢,必須引入異常處理語句完善代碼。因此,異常處理機制用于檢測和處理異常,提高java程序的健壯性。
在java中,所有的異常都當做對象處理,即當發生異常時產生了異常對象。java異常處理機制的語法為:
try{ //可能出現異常的語句 }catch(異常類型 對象){ //異常處理 }finally{ //不管是否出現異常,仍會統一執行的代碼 }
try語句用于捕獲可能出現異常的代碼。catch語句根據不同的異常類型進行不同的異常處理,因此一個try語句可以對應多個catch語句。如果try語句中產生異常,程序會跳轉到匹配異常類型的catch語句中,進行異常處理。不管程序是否產生異常,都會執行finally語句。finally語句可以省略。如果省略了finally語句,程序在執行完catch語句后,會繼續向下執行。
catch語句和finally語句可以省略,但是不能同時省略。異常格式的組合通常有如下三種:try...catch, try...catch...finally, try...finally。
在java中,所有異常類型最高繼承類是Throwable。Throwable下面有兩個子類Error和Exception。java的異常子類命名都會使用***Error或***Exception的形式,開發者可以根據這個特征進行區分Error和Exception。
Error是JVM錯誤,屬于不可查錯誤。出現Error時程序因無法處理,沒有執行。
Exception是程序運行中的錯誤,用戶可以使用異常處理格式處理。異常分為可查異常和不可查異常。
不可查異常是在運行中出現的異常。這類異常在編譯中可能出現,也可能不出現,所以在程序中可以選擇處理這類異常,或者選擇不處理。RuntimeException和其子類屬于不可查異常。
可查異常是在編譯時被強制檢查的異常。這種異常可以預見,因此必須在程序中進行處理,或進行捕獲和處理,或拋出給上一級調用方法處處理。否則,編譯將無法通過。RuntimeException以外的異常都屬于可查異常。
ArithmeticException:數學運算異常。
NullPointerException:空指針異常。
NegativeArraySizeException:數組大小為負值異常。
ArrayIndexOutOfBoundException:數組下標越界異常。
NumberFormatException:數字格式異常。
InputMismatchException:輸入類型不匹配異常。
NoSuchMethodException:方法不存在異常。
DataFormatException:數據格式錯誤異常。
NoClassDefFoundError:未找到類定義錯誤。
OutOfMemoryError:內存不足錯誤。
StackOverflowError:堆棧溢出錯誤。
ThreadDeath:線程結束。
UnknownError:未知錯誤。
public Throwable getCause() //返回Throwable對象的原因。
public String getMessage() //返回Throwable對象的詳細信息
public void printStackTrace() //將此Throwable對象的堆棧跟蹤輸出至錯誤輸出流,作為System.err的值異常的處理流程
1、當程序出現異常,JVM自動根據異常的類型實例化一個與之類型匹配的異常類對象。
2、根據異常對象判斷是否存在異常處理。如果不存在異常處理,則由JVM對異常默認處理:輸出異常信息,結束程序調用。
3、如果存在異常捕獲操作,try語句捕獲異常類實例化對象,再與catch語句進行異常類型匹配,并處理異常。
4、不管是否匹配到catch語句,如果存在finally語句,就會執行finally語句代碼。
5、finally語句后面的代碼根據之前是否匹配到catch語句進行處理。如果匹配到catch語句,也即捕獲到異常,則繼續執行finally后的語句。如果沒有匹配到catch語句,則將異常交由JVM默認處理。
異常捕獲是一個異常類對象的傳遞過程,所有異常類對象都可以相父類對象轉型。因此可以異常類對象可以使用Exception接收,簡單實現異常處理。
對于異常分開處理還是一起處理的問題,沒有嚴格的規范,而是根據項目開發標準決定。異常分開處理便于代碼的維護,統一處理則可以節省開發精力。
在處理多個異常時,范圍小的異常要放在范圍大的異常之前處理。否則,范圍小的異常會因異常處理完成而無法處理。
throws關鍵字用在方法的定義上,表示此方法不進行異常的處理,而是交給被調用處處理。
myMath.java class myMath{ public static int div(int x, int y) throws Exception{ //該方法不處理異常 return x/y; } } exception_throws.java public class exception_throws{ public static void main(String args[]){ try{ //div()方法拋出異常,這里必須明確處理異常 System.out.println(myMath.div(10,0)); }catch(Exception e){ e.printStackTrace(); } } }throw關鍵字
throw關鍵字用于用戶手動拋出一個異常類實例化對象。
exception_throw.java public class exception_throw{ public static void main(String args[]){ try{ throw new Exception("self-defined exception"); //直接拋出自定義異常類對象 }catch(Exception e){ e.printStackTrace(); } } }異常處理的標準格式
除在上面提到的三種異常組合格式,還有一種是try...catch...finally結合throw和throws的異常處理格式。
class myMath{ public static int div(int x, int y) throws Exception{ //出現異常交給被調用處輸出 System.out.println("===start==="); int result = 0; try{ result = x / y; }catch(Exception e){ throw e; //向上拋出 }finally{ System.out.println("===end==="); } return result; } } public class exception_standerd{ public static void main(String args[]){ try{ System.out.println(myMath.div(10,0)); //被調用處處理異常 }catch(Exception e){ e.printStackTrace(); } } }
在本例中,也可以將myMath.java中的catch語句省略。myMath.java中的try語句捕獲的異常通過div()方法拋出給調用處處理。
RuntimeException類RuntimeException的子類對象可以根據用戶需要進行有選擇的處理,程序在編譯時不會強制性要求用戶處理異常,所以在調用時不處理也不會有任何編譯錯誤。如果沒有處理卻發生異常,則交給JVM默認處理。
例如Integer類中的parseInt()方法
public static int parseInt(String s) throws NumberFormatException;
異常類NumberFormatException屬于RuntimeException子類。使用parseInt()時可根據需要處理Runtime子類異常。
public class exception_RuntimeException{ public static void main(String args[]){ int temp = Integer.parseInt("100"); System.out.println(temp); } }assert關鍵字
assert在JDK1.4時候引入的,通常用于程序不準備使用捕獲異常來處理的錯誤。其功能是在程序執行到某行后,判斷是否是預期的結果。斷言的語法格式:
assert 布爾表達式
assert 布爾表達式:字符串表達式
java默認沒有開啟斷言功能。因此程序正式執行時不用去除斷言語句。在執行解釋java字節碼文件時,增加參數“-ea”,開啟斷言功能。
java -ea exception_assert
public class exception_assert{ public static void main(String args[]){ int num = 10; assert num == 20 : "num isn"t 20"; System.out.println("num = " + num); } }自定義異常
當java提供的異常類型不能滿足開發需要時,可以自己開發一個異常類。實現自定義異常類,只需要繼承Exception或RuntimeException父類即可。
class AddException extends Exception{ public AddException(String msg){ super(msg); } } public class exception_selfdefine{ public static void main(String args[]){ int num = 20; try{ if(num > 10){ throw new AddException("value is too large!"); } }catch(Exception e){ e.printStackTrace(); } } }練習
填空
1、 Throwable下有哪兩個子類: 。
2、 ArthmeticException類表示 異常,ArraysIndexOutOfBoundsException表示 異常。
3、 一個try代碼后面必須跟著若干個 代碼段或者一個 代碼段。
4、 如果一個方法使用了 ,則編譯器會強制在使用此方法時進行異常的處理。
5、 異常處理中使用 作為異常的統一出口。
選擇
1、 使用那個關鍵字可以在程序中手工拋出異常 。
A、 throws B、 throw C、 assert D、 class
2、 下面 關鍵字可以用在方法的聲明處?
A、 throws B、 assert C、 class D、 interface
3、 為了捕獲一個異常,代碼必須放在下面 語句塊中。
A、 try塊 B、 catch塊 C、 throws塊 D、 finally塊
4、 下面關于try塊的說法正確的是 。
A、 try塊后至少應有一個catch塊 B、 try塊后必須有finally塊 C、 可能拋出異常的方法應放在try塊中 D、 對拋出的異常的處理應放在try塊中
5、 finally塊中的代碼將 。
A、 總是被執行 B、 如果try塊后面沒有catch塊時,finally塊中的代碼才會執行 C、 異常發生時才被執行 D、 異常沒有發生時才執行
6、 一個異常將終止 。
A、 整個程序 B、 只終止拋出異常的方法 C、 產生異常的try塊 D、 上面的說法都不對
7、 所有異常的共同父類是 。
A、 Error B、 Exception C、 Throwable D、 RuntimeException
判斷
1、 一個try語句后有多個catch時,捕獲范圍大的異常要放在捕獲范圍小的異常之后。 ( )
2、 finally語句可以根據需要有選擇的添加。 ( )
簡答
1、 簡述RuntimeException和Exception的區別。
2、 try、catch、finally三種語句的功能是什么?
3、 簡述Java中的異常處理機制。
4、 簡述Error和Exception的區別。
5、 列舉三個常見的RuntimeException子類。
編程
1、 編寫應用程序,從命令行輸入兩個小數參數,求它們的商。要求程序中捕獲NumberFormatException異常和ArithmeticException異常。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76910.html
摘要:目錄介紹問題匯總具體問題好消息博客筆記大匯總年月到至今,包括基礎及深入知識點,技術博客,學習筆記等等,還包括平時開發中遇到的匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續完善開源的文件是格式的同時也開源了生活博客,從年 目錄介紹 00.Java問題匯總 01.具體問題 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎及深入知識點,Android技...
摘要:運行時數據區域的學習,是學習以及機制的基礎,也是深入理解對象創建及運行過程的前提。了解內存區域劃分,是學習概念的前提。 Java 運行時數據區域的學習,是學習 jvm 以及 GC 機制的基礎,也是深入理解 java 對象創建及運行過程的前提。廢話不多說,直接進入正題: 一張圖總結 showImg(https://segmentfault.com/img/bVOMAn?w=685&h=5...
摘要:當多個線程對同一個集合的內容進行操作時,就可能會產生事件。當某一個線程遍歷的過程中,的內容被另外一個線程所改變了就會拋出異常,產生事件。在線程在遍歷過程中的某一時刻,線程執行了,并且線程刪除了中的節點。 概要 前面,我們已經學習了ArrayList。接下來,我們以ArrayList為例,對Iterator的fail-fast機制進行了解。 1 fail-fast簡介 fail-fast...
閱讀 1270·2023-04-25 19:10
閱讀 1146·2021-09-10 10:50
閱讀 3034·2021-09-02 15:21
閱讀 1388·2019-08-30 15:52
閱讀 1686·2019-08-30 13:56
閱讀 2090·2019-08-30 12:53
閱讀 1876·2019-08-28 18:22
閱讀 2128·2019-08-26 13:47