摘要:案例演示該句運(yùn)行時(shí)發(fā)生了數(shù)組索引越界異常,由于沒有處理異常,導(dǎo)致程序無法繼續(xù)執(zhí)行,程序結(jié)束。用來進(jìn)行某種異常的捕獲,實(shí)現(xiàn)對(duì)捕獲到的異常進(jìn)行處理。運(yùn)行時(shí)期異常一旦發(fā)生需要程序人員修改源代碼。
01異常的概述
* A: 異常的概述 * a:什么是異常 * Java代碼在運(yùn)行時(shí)期發(fā)生的問題就是異常。 * b:異常類 * 在Java中,把異常信息封裝成了一個(gè)類。 * 當(dāng)出現(xiàn)了問題時(shí),就會(huì)創(chuàng)建異常類對(duì)象并拋出異常相關(guān)的信息(如異常出現(xiàn)的位置、原因等)。 * c:我們見過的異常:數(shù)組角標(biāo)越界異常ArrayIndexOutOfBoundsException,空指針異常NullPointerException02異常的繼續(xù)體系和錯(cuò)誤的區(qū)別
* A: 異常的繼承體系 Throwable: 它是所有錯(cuò)誤與異常的超類(祖宗類) |- Error 錯(cuò)誤 |- Exception 編譯期異常,進(jìn)行編譯JAVA程序時(shí)出現(xiàn)的問題 |- RuntimeException 運(yùn)行期異常, JAVA程序運(yùn)行過程中出現(xiàn)的問題 * B:異常與錯(cuò)誤的區(qū)別 * a:異常 * 指程序在編譯、運(yùn)行期間發(fā)生了某種異常(XxxException),我們可以對(duì)異常進(jìn)行具體的處理。 * 若不處理異常,程序?qū)?huì)結(jié)束運(yùn)行。 * 案例演示: public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr[0]); System.out.println(arr[3]); // 該句運(yùn)行時(shí)發(fā)生了數(shù)組索引越界異常ArrayIndexOutOfBoundsException, // 由于沒有處理異常,導(dǎo)致程序無法繼續(xù)執(zhí)行,程序結(jié)束。 System.out.println("over"); // 由于上面代碼發(fā)生了異常,此句代碼不會(huì)執(zhí)行 } * b:錯(cuò)誤 * 指程序在運(yùn)行期間發(fā)生了某種錯(cuò)誤(XxxError),Error錯(cuò)誤通常沒有具體的處理方式,程序?qū)?huì)結(jié)束運(yùn)行。 * Error錯(cuò)誤的發(fā)生往往都是系統(tǒng)級(jí)別的問題,都是jvm所在系統(tǒng)發(fā)生的,并反饋給jvm的。 * 我們無法針對(duì)處理,只能修正代碼。 * 案例演示: public static void main(String[] args) { int[] arr = new int[1024*1024*100]; //該句運(yùn)行時(shí)發(fā)生了內(nèi)存溢出錯(cuò)誤OutOfMemoryError,開辟了過大的數(shù)組空間, //導(dǎo)致JVM在分配數(shù)組空間時(shí)超出了JVM內(nèi)存空間,直接發(fā)生錯(cuò)誤。 }03異常對(duì)象的產(chǎn)生原因和處理方式
* A: 異常對(duì)象的產(chǎn)生原因 * 案例代碼: ? * 工具類 class ArrayTools{ //對(duì)給定的數(shù)組通過給定的角標(biāo)獲取元素。 public static int getElement(int[] arr,int index) { int element = arr[index]; return element; } } * 測(cè)試類 class ExceptionDemo2 { public static void main(String[] args) { int[] arr = {34,12,67}; int num = ArrayTools.getElement(arr,4) System.out.println("num="+num); System.out.println("over"); } } * 原因分析: * a: 由于沒找到4索引,導(dǎo)致運(yùn)行時(shí)發(fā)生了異常。這個(gè)異常JVM認(rèn)識(shí):ArrayIndexOutOfBoundsException。 這個(gè)異常Java本身有描述:異常的名稱、異常的內(nèi)容、異常的產(chǎn)生位置。 java將這些信息直接封裝到異常對(duì)象中。new ArrayIndexOutOfBoundsException(4); * b:throw new ArrayIndexOutOfBoundsException(4);產(chǎn)生異常對(duì)象。JVM將產(chǎn)生的異常拋給調(diào)用者main()方法。 * c:main()方法接收到了數(shù)組索引越界異常對(duì)象。 由于main()方法并沒有進(jìn)行處理異常,main()方法就會(huì)繼續(xù)把異常拋給調(diào)用者JVM。 當(dāng)JVM收到異常后,將異常對(duì)象中的名稱、異常內(nèi)容、位置都顯示在就控制臺(tái)上。同時(shí)讓程序立刻終止。 * B:異常的處理方式 * a:JVM的默認(rèn)處理方式 * 把異常的名稱,原因,位置等信息輸出在控制臺(tái),同時(shí)會(huì)結(jié)束程序。 * 一旦有異常發(fā)生,其后來的代碼不能繼續(xù)執(zhí)行。 * b:解決程序中異常的手動(dòng)方式 * a):編寫處理代碼 try...catch...finally * b):拋出 throws04方法內(nèi)部拋出對(duì)象throw關(guān)鍵字
在java中,提供了一個(gè)throw關(guān)鍵字,它用來拋出一個(gè)指定的異常對(duì)象。 * A: 什么時(shí)候使用throw關(guān)鍵字? * 當(dāng)調(diào)用方法使用接受到的參數(shù)時(shí),首先需要先對(duì)參數(shù)數(shù)據(jù)進(jìn)行合法的判斷, 數(shù)據(jù)若不合法,就應(yīng)該告訴調(diào)用者,傳遞合法的數(shù)據(jù)進(jìn)來。 這時(shí)需要使用拋出異常的方式來告訴調(diào)用者。 * B: 使用throw關(guān)鍵字具體操作 * a: 創(chuàng)建一個(gè)異常對(duì)象。封裝一些提示信息(信息可以自己編寫)。 * b: 通過關(guān)鍵字throw將這個(gè)異常對(duì)象告知給調(diào)用者。throw 異常對(duì)象; throw 用在方法內(nèi),用來拋出一個(gè)異常對(duì)象,將這個(gè)異常對(duì)象傳遞到調(diào)用者處,并結(jié)束當(dāng)前方法的執(zhí)行。 * C: throw關(guān)鍵字使用格式 * throw new 異常類名(參數(shù)); * 例如: throw new NullPointerException("要訪問的arr數(shù)組不存在"); throw new ArrayIndexOutOfBoundsException("該索引在數(shù)組中不存在,已超出范圍"); * D:案例演示 * throw的使用05方法聲明異常關(guān)鍵字throws
* A: 聲明 * 將問題標(biāo)識(shí)出來,報(bào)告給調(diào)用者。如果方法內(nèi)通過throw拋出了編譯時(shí)異常,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進(jìn)行聲明,讓調(diào)用者去處理。 * B: 聲明異常格式 * 修飾符 返回值類型 方法名(參數(shù)) throws 異常類名1,異常類名2… { } * C:注意事項(xiàng): * throws用于進(jìn)行異常類的聲明,若該方法可能有多種異常情況產(chǎn)生,那么在throws后面可以寫多個(gè)異常類,用逗號(hào)隔開。 * D:代碼演示: * 多個(gè)異常的處理
==============================第二節(jié)課開始====================================
06try...catch異常處理* A: 捕獲 * Java中對(duì)異常有針對(duì)性的語(yǔ)句進(jìn)行捕獲,可以對(duì)出現(xiàn)的異常進(jìn)行指定方式的處理 * B: 捕獲異常格式 try { //需要被檢測(cè)的語(yǔ)句。 } catch(異常類 變量) { //參數(shù)。 //異常的處理語(yǔ)句。 } finally { //一定會(huì)被執(zhí)行的語(yǔ)句。 } * C: 格式說明 * a: try * 該代碼塊中編寫可能產(chǎn)生異常的代碼。 * b: catch * 用來進(jìn)行某種異常的捕獲,實(shí)現(xiàn)對(duì)捕獲到的異常進(jìn)行處理。 * c: finally: * 有一些特定的代碼無論異常是否發(fā)生,都需要執(zhí)行。 * 另外,因?yàn)楫惓?huì)引發(fā)程序跳轉(zhuǎn),導(dǎo)致有些語(yǔ)句執(zhí)行不到。 * 而finally就是解決這個(gè)問題的,在finally代碼塊中存放的代碼都是一定會(huì)被執(zhí)行的。 * d:try...catch...處理掉異常后,程序可以繼續(xù)執(zhí)行 * D:案例演示 * 捕獲異常格式07多catch處理
* A:一個(gè)try 多個(gè)catch組合 * 對(duì)代碼進(jìn)行異常檢測(cè),并對(duì)檢測(cè)的異常傳遞給catch處理。對(duì)每種異常信息進(jìn)行不同的捕獲處理。 * B:多catch處理的格式 void show(){ //不用throws try{ throw new Exception();//產(chǎn)生異常,直接捕獲處理 }catch(XxxException e){ //處理方式 }catch(YyyException e){ //處理方式 }catch(ZzzException e){ //處理方式 } } 注意事項(xiàng):在捕獲異常處理中,變量也是有作用域的,如可以定義多個(gè)catch中異常變量名為e。08多catch處理細(xì)節(jié)
* A:細(xì)節(jié):多個(gè)catch小括號(hào)中,寫的是異常類的類名,有沒有順序的概念? * 有順序關(guān)系。 * B:平級(jí)異常: * 拋出的異常類之間,沒有繼承關(guān)系,沒有順序 NullPointerException extends RuntimeException NoSuchElementException extends RuntimeException ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException extends RuntimeException * C:上下級(jí)關(guān)系的異常 * 越高級(jí)的父類,越寫在下面 NullPointerException extends RuntimeException extends Exception09finally代碼塊
* A: finally的特點(diǎn) * 被finally控制的語(yǔ)句體一定會(huì)執(zhí)行 * B:finally的作用 * finally,無論程序是否有異常出現(xiàn),程序必須執(zhí)行釋放資源在 如:IO流操作和數(shù)據(jù)庫(kù)操作中會(huì)見到10調(diào)用拋出異常方法try和throws處理方式
* A: 在實(shí)際開發(fā)中使用哪種異常處理方式呢? * 能自己處理的盡量自己處理。(建議用try...catch)
==============================第三節(jié)課開始====================================
11運(yùn)行時(shí)期異常的特點(diǎn)* A: 運(yùn)行時(shí)期異常的概述: * RuntimeException和他的所有子類異常,都屬于運(yùn)行時(shí)期異常。 NullPointerException,ArrayIndexOutOfBoundsException等都屬于運(yùn)行時(shí)期異常. * B:運(yùn)行時(shí)期異常的特點(diǎn) * a:方法中拋出運(yùn)行時(shí)期異常,方法定義中無需throws聲明,調(diào)用者也無需處理此異常。 * b:運(yùn)行時(shí)期異常一旦發(fā)生,需要程序人員修改源代碼。 設(shè)計(jì)原因: 運(yùn)行異常,不能發(fā)生,但是如果發(fā)生了,程序人員停止程序修改源代碼 運(yùn)行異常: 一旦發(fā)生,不要處理,請(qǐng)你修改源代碼,運(yùn)行異常一旦發(fā)生,后面的代碼沒有執(zhí)行的意義12運(yùn)行異常的案例
* A: 計(jì)算圓的面積案例 定義方法,計(jì)算圓形的面積 傳遞參數(shù)0,或者負(fù)數(shù),計(jì)算的時(shí)候沒有問題 但是,違反了真實(shí)情況 參數(shù)小于=0, 停止程序,不要在計(jì)算了 * B:數(shù)組索引越界案例 使用數(shù)組中不存在的索引 public class RuntimeExceptionDemo { public static void main(String[] args) { double d = getArea(1); System.out.println(d); } /* * 定義方法,計(jì)算圓形的面積 * 傳遞參數(shù)0,或者負(fù)數(shù),計(jì)算的時(shí)候沒有問題 * 但是,違反了真實(shí)情況 * 參數(shù)小于=0, 停止程序,不要在計(jì)算了 */ public static double getArea(double r){ if(r <= 0) throw new RuntimeException("圓形不存在"); return r*r*Math.PI; } public static void function(){ int[] arr = {1,2,3}; //對(duì)數(shù)組的5索引進(jìn)行判斷,如果5索引大于100,請(qǐng)將5索引上的數(shù)據(jù)/2,否則除以3 //索引根本就沒有 if(arr[5] > 100){ arr[5] = arr[5]/2; }else{ arr[5] = arr[5]/3; } }13方法重寫時(shí)候異常的處理
* A:方法重寫時(shí)候異常的處理 * a:子類覆蓋父類方法時(shí),如果父類的方法聲明異常,子類只能聲明父類異?;蛘咴摦惓5淖宇?,或者不聲明。 例如: class Fu { public void method () throws RuntimeException { } } class Zi extends Fu { public void method() throws RuntimeException { } //拋出父類一樣的異常 //public void method() throws NullPointerException{ } //拋出父類子異常 } * b:當(dāng)父類方法聲明多個(gè)異常時(shí),子類覆蓋時(shí)只能聲明多個(gè)異常的子集。 例如: class Fu { public void method () throws NullPointerException, ClassCastException{ } } class Zi extends Fu { public void method()throws NullPointerException, ClassCastException { } public void method() throws NullPointerException{ } //拋出父類異常中的一部分 public void method() throws ClassCastException { } //拋出父類異常中的一部分 } * c:當(dāng)被覆蓋的方法沒有異常聲明時(shí),子類覆蓋時(shí)無法聲明異常的。 例如: class Fu { public void method (){ } } class Zi extends Fu { public void method() throws Exception { }//錯(cuò)誤的方式 } * B:?jiǎn)栴}:父類中會(huì)存在下列這種情況,接口也有這種情況。 接口中沒有聲明異常,而實(shí)現(xiàn)的子類覆蓋方法時(shí)發(fā)生了異常,怎么辦? 回答:無法進(jìn)行throws聲明,只能catch的捕獲。 萬一問題處理不了呢?catch中繼續(xù)throw拋出,但是只能將異常轉(zhuǎn)換成RuntimeException子類拋出。14Throwable類方法
* A: 常見方法 * a:getMessage()方法 返回該異常的詳細(xì)信息字符串,即異常提示信息 * b:toString()方法 返回該異常的名稱與詳細(xì)信息字符串 * c:printStackTrace()方法 在控制臺(tái)輸出該異常的名稱與詳細(xì)信息字符串、異常出現(xiàn)的代碼位置 * B:案例演示 異常的常用方法代碼演示 try { Person p= null; if (p==null) { throw new NullPointerException(“出現(xiàn)空指針異常了,請(qǐng)檢查對(duì)象是否為null”); } } catch (NullPointerException e) { String message = e.getMesage(); System.out.println(message ); String result = e.toString(); System.out.println(result); e.printStackTrace(); }
======================第四節(jié)課開始=========
15自定義異常* A: 自定義異常的定義 * a:通過閱讀源碼,發(fā)現(xiàn)規(guī)律: 每個(gè)異常中都調(diào)用了父類的構(gòu)造方法,把異常描述信息傳遞給了父類,讓父類幫我們進(jìn)行異常信息的封裝。 * b:格式: Class 異常名 extends Exception{ //或繼承RuntimeException public 異常名(){ } public 異常名(String s){ super(s); } } * c:自定義異常繼承Exception演示 * d:自定義異常繼承RuntimeException演示 * B:自定義異常的練習(xí) 在Person類的有參數(shù)構(gòu)造方法中,進(jìn)行年齡范圍的判斷, 若年齡為負(fù)數(shù)或大于200歲,則拋出NoAgeException異常,異常提示信息“年齡數(shù)值非法”。 要求:在測(cè)試類中,調(diào)用有參數(shù)構(gòu)造方法,完成Person對(duì)象創(chuàng)建,并進(jìn)行異常的處理。 * C:關(guān)于構(gòu)造方法拋出異常總結(jié) 構(gòu)造函數(shù)到底拋出這個(gè)NoAgeException是繼承Exception呢?還是繼承RuntimeException呢? * a:繼承Exception,必須要throws聲明,一聲明就告知調(diào)用者進(jìn)行捕獲,一旦問題處理了調(diào)用者的程序會(huì)繼續(xù)執(zhí)行。 * b:繼承RuntimeExcpetion,不需要throws聲明的,這時(shí)調(diào)用是不需要編寫捕獲代碼的,因?yàn)檎{(diào)用根本就不知道有問題。 一旦發(fā)生NoAgeException,調(diào)用者程序會(huì)停掉,并有jvm將信息顯示到屏幕,讓調(diào)用者看到問題,修正代碼。16總結(jié)
把今天的知識(shí)點(diǎn)總結(jié)一遍。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67163.html
摘要:當(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ū)別【理解】...
摘要:表示異常,異常產(chǎn)生后程序員可以通過代碼的方式糾正,使程序繼續(xù)運(yùn)行,是必須要處理的。獲取發(fā)生異常的原因。需要將這個(gè)異常對(duì)象告知給調(diào)用者。另外,因?yàn)楫惓?huì)引發(fā)程序跳轉(zhuǎn),導(dǎo)致有些語(yǔ)句執(zhí)行不到。多個(gè)異常一次捕獲,多次處理。 day05 【異常、線程】 主要內(nèi)容 異常、線程 教學(xué)目標(biāo) [ ] 能夠辨別程序中異常和錯(cuò)誤的區(qū)別 [ ] 說出異常的分類 [ ] 說出虛擬機(jī)處理異常的方式 [ ] 列舉...
摘要:不過按照經(jīng)驗(yàn)來說,這類異常要么盡量避免,要么出現(xiàn)了就要做異常處理,從而保證程序的健壯性。業(yè)務(wù)是千變?nèi)f化,但是它們可能產(chǎn)生的異常處理方式是不會(huì)變化的,按照這個(gè)思路去做異常處理即可。 前言:說到異常體系,可能對(duì)于一些初入職場(chǎng)的老鐵會(huì)很頭痛,不能夠很清晰的描述異常是個(gè)什么情況。那么本文將通過打流水仗的方式給大家介紹一下工作中涉及的異常知識(shí)。首先能看到本文,說明也對(duì)異常是有了解的,所以文章開頭...
摘要:異常異常的概述和分類異常的概述異常就是程序在運(yùn)行過程中出現(xiàn)的錯(cuò)誤。運(yùn)行時(shí)異常就是程序員所犯的錯(cuò)誤,需要回來修改代碼。獲取異常類名和異常信息,返回字符串。如果路徑名不同,就是改名并剪切。刪除注意事項(xiàng)中的刪除不走回收站。 1_異常(異常的概述和分類) A:異常的概述 異常就是Java程序在運(yùn)行過程中出現(xiàn)的錯(cuò)誤。 B:異常的分類 通過API查看Throwable Error 服務(wù)...
摘要:靜態(tài)變量是被泛型類的所有實(shí)例所共享的。所以引用能完成泛型類型的檢查。對(duì)于這個(gè)類型系統(tǒng),有如下的一些規(guī)則相同類型參數(shù)的泛型類的關(guān)系取決于泛型類自身的繼承體系結(jié)構(gòu)。事實(shí)上,泛型類擴(kuò)展都不合法。 前言 和C++以模板來實(shí)現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時(shí)支持選擇了泛型,兩者的實(shí)現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為泛型參數(shù);Java可以在泛型類的方法中取得...
閱讀 961·2021-10-27 14:19
閱讀 1184·2021-10-15 09:42
閱讀 1615·2021-09-14 18:02
閱讀 800·2019-08-30 13:09
閱讀 3046·2019-08-29 15:08
閱讀 2156·2019-08-28 18:05
閱讀 1009·2019-08-26 10:25
閱讀 2851·2019-08-23 16:28