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