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