Java程序基础——异常
目錄
目錄
1、異常
2、異常的繼承體系
3、異常與錯誤的區別
4、異常對象的產生原因及處理方式
5、拋出異常thorw
6、聲明異常throws
7、 捕獲異常 try ..catch...finally
8、異常處理的組合方式
9、finally代碼塊
10、調用拋出異常方法
11、運行期異常
12、方法重寫時異常的處理
13、異常中常用方法
14、自定義異常類的定義
15、自定義異常的練習
1、異常
什么是異常?
- Java代碼在運行時期發生的問題就是異常
- 異常類:在Java中,把異常信息封裝成了一個類,當出現了問題時,就會胡藏劍異常對象,并拋出異常相關的信息(如異常出現的位置、原因等)
- 比如:ArrayIndedOutOfBoundsException
2、異常的繼承體系
- 在Java中,使用Exception類來描述異常。通過查詢API,發現Exception其實時Throwable的子類。Throwable是Java語言中所有錯誤或異常的父類。
- RuntimeException及其子類、只能在java程序運行中出現
- Error是Throwable的子類,它與Exception平級,它用來表示Java程序中可能會產生的嚴重錯誤。解決辦法只有一個,就是修改代碼避免Error的產生。
3、異常與錯誤的區別
- ?異常:表示程序在編譯、運行期間發生的某種異常(XXXException),我們可以對異常進行具體的處理。若不處理異常,程序將結束運行。
- 錯誤:指程序在運行期間發生了某種錯誤(XxxError),Error錯誤通常沒有具體的處理方式,程序將會結束運行。Error錯誤的發生往往都是系統級別的問題,我們無法針對處理,只能修改代碼。
4、異常對象的產生原因及處理方式
class ArrayTools{public static int getElement (int[] arr,int index) {int element = arr[index];return element;}public class ExceptionDemo{public static void main(String[] args) {int[] arr = {1,2,3};int element = ArrayTools.getElement(arr,4);System.out.println("element="+element);} }原因分析:
- 由于沒有找到索引【4】,導致運行時發生了異常,這個異常JVM認識:ArrayIndexOutOfBoundsException。這個異常Java本省有描述:異常的名稱、異常的內容、異常產生的位置。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Java將這些信息直接封裝到異常對象中:new?ArrayIndexOutOfBoundsException(4);
- throw new?ArrayIndexOutOfBoundsException(4) 產生異常對象,JVM將產生的異常拋給調用者main()方法。
- main()方法接收到了數組索引越界異常對象。由于main()方法并沒有進入處理異常,main()方法會繼續把異常拋給調用者JVM,當JVM接收到異常后,將異常的名稱、異常的內容、異常產生的位置都顯示在控制臺上,同時讓程序立刻終止。
異常的處理方式:
- JVM的默認處理方式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?將異常對象的名稱、原因、位置等信息輸出到控制臺,同時結束程序。一旦有異常發生,其后面的代碼不再執行
- 解決程序中異常的手動方式
5、拋出異常thorw
在java中,提供了一個throw關鍵字,用來拋出一個指定的異常對象。
- 什么時候使用throw關鍵字?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——當調用方法使用接受到的參數時,首先需要對參數數據進行合法的判斷,數據若不合法,就應該告訴調用者,傳遞合法的數據進來。這時需要使用拋出異常的方式來告訴調用者。
- 使用throw關鍵字具體操作
throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,并結束當前方法的執行。
使用格式:
throw new 異常類名(參數);?? ? ? ? ? ? ? ? ? ??
throw new NullPointerException("要訪問的數組不存在"); throw new ArrayIndexOutOfBoundsException("該索引在數組中不存在,已超出范圍"); public class ArrayTools {public static int getElement(int arr[],int index){if(arr==null){throw new NullPointerException("要訪問的數組不存在");}if(index < 0 || index >= arr.length){throw new ArrayIndexOutOfBoundsException("該索引"+index+"在數組中不不存在");}int element = arr[index];return element;} }public class ExceptionDemo {public static void main(String[] args) {int[] arr = {1,2,3};int element = ArrayTools.getElement(arr,4);System.out.println("element="+element);} }6、聲明異常throws
聲明:將問題表示出來,報告給調用者。如果方法內通過throw拋出了編譯時異常,而沒有捕獲異常,那么必須通過throws進行聲明,讓調用者去處理
聲明格式:
修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2..{}注意事項:
throws用于進行異常類的聲明,若該方法可能有多種異常情況產生,那么在throws后面可以寫多個異常類,用逗號隔開。
public void show(int x) throws Exception {if(x>0){throw new Exception() ;}else {System.out.println("x="+x);}}7、 捕獲異常 try ..catch...finally
捕獲:java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理
捕獲異常格式:
try{// 需要被檢測的語句 }catch (異常類 變量){// 異常的處理語句 }finally {// 一定會被執行的語句 }- try:該代碼塊中編寫可能產生異常的代碼
- catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理
- finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句不能執行,而finally就是解決這個問題的。在finally代碼塊中的代碼都是一定會被執行的!
- try...catch... 處理掉異常后,程序可以繼續執行
8、異常處理的組合方式
- try..catch..finally:檢測異常,并傳遞給catch處理,最后在fianlly中進行資源釋放。
- try..catch 組合:對代碼進行異常檢測,并對檢測到的異常傳遞給catch處理。
- try..finally?組合:對代碼進行異常檢測,由于沒有catch,一般會被默認的JVM輸出。異常沒有捕獲處理,但是功能所開啟的資源需要進行關閉,所以finally的存在是關閉資源。
- 一個try多個catch組合:對代碼快進行異常檢測,并對檢測到的異常傳遞給catch處理。對每種異常信息進行不同的捕獲處理。
多個catch處理的細節:
多個catch小括號中,寫的是異常類的類名,它是由順序關系的
- 平級異常——拋出的異常類之間,沒有繼承關系,沒有順序
- 上下級關系的異常 ——越高級的父類,寫在越下面
9、finally代碼塊
特點:被finally控制的語句體一定會執行
作用:無論程序是否有異常出現,程序必須執行釋放資源。如:IO流操作、數據庫操作。
10、調用拋出異常方法
有 try...catch 和 throws 兩種
在實際開發中使用哪種異常處理方式?
- 能自己處理的盡量自己處理。(建議使用 try...catch)
11、運行期異常
1、概述:
- RuntimeException和它的所有子類異常,都屬于運行期異常? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如
- ArrayIndexOutOfBoundsException,NullPointerException 等都屬于運行時期異常
2、特點:
- 方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常。
- 運行時期異常一旦發生,需要程序人員修改源代碼。
- 設計原因:運行異常,不能發生,但如果發生了,程序人員要停止程序,修改源代碼。運行異常一旦發生,后面的代碼沒有執行的意義。
12、方法重寫時異常的處理
- 子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或該異常的的子類,獲取不聲明。
- 當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集
- 當覆蓋的方法沒有異常聲明時,子類覆蓋時無法聲明異常
- ?父類或接口中,沒有聲明異常,但子類覆蓋方法時發生了異常,怎么辦?
? ? ? ? 無法進行throws聲明,只能catch捕獲。萬一問題處理不了,catch中繼續throw拋出,但是只能將異常轉換為RuntimeException子類拋出。
interface Inter{public abstract void method(); } public class Zi implements Inter{@Overridepublic void method() {int[] arr = null;if (arr == null){try {throw new Exception("數組不存在!");}catch (Exception e){System.out.println("父方法中沒有聲明異常,子類中不能拋出Exception異常");throw new RuntimeException(e);}}} }13、異常中常用方法
- getMessage():返回該異常的詳細信息字符串,即異常提示信息
- printStackTrace(): 在控制臺輸出該異常的名稱、詳細信息字符串、異常出現的代碼位置。
- toString():返回該異常的名稱與詳細信息字符串
14、自定義異常類的定義
class 異常名 extends Exception { // 或者繼承RuntimeExceptionpublic MyException(){super();} public MyException(String message){super(message);} }?自定義異常繼承RuntimeException:
public class MyRuntimeException extends RuntimeException{public MyRuntimeException(){super();}public MyRuntimeException(String message){super(message);} }15、自定義異常的練習
定義Person類,包含name和age兩個成員屬性
在Person類的有參構造方法中,進行年齡范圍的判讀,若年齡為負數或者大于100歲,則拋出NoAgeException異常,異常提示信息:“年齡數值非法”
要求:在測試類中,調用有參構造方法,完成Person對象創建,并進行異常處理
(1)自定義異常類NoAgeException?
public class NoAgeException extends Exception{public NoAgeException(){super();}public NoAgeException(String message){super(message);} }(2)自定義類Person
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) throws NoAgeException {if(age<0 || age>200){throw new NoAgeException(age + "年齡數值非法");}this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}(3)測試類
public class NoAgeExceptionDemo {public static void main(String[] args) {try {Person person = new Person("小鐳", 999);System.out.println(person.getAge());} catch (NoAgeException e) {e.printStackTrace();}} }構造方法拋出的這個NoAgeException到底是繼承Exception,還是繼承RuntimeException?
- 繼承Exception,必須要throws聲明,告知調用者進行捕獲,一旦問題處理了,調用者程序會繼續執行
- 繼承RuntimeException,不需要throws聲明,這時調用是不需要寫捕獲異常代碼,因為調用者根本不知道有問題。一旦發生NoAgeException,調用者的程序會停掉,并由JVM將信息顯示到屏幕,讓調用者看到問題,修正代碼
總結
以上是生活随笔為你收集整理的Java程序基础——异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用OFBIZ的理由和不使用OFBIZ的
- 下一篇: java娘_如何调教Java娘来优化MC