日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java程序基础——异常

發布時間:2024/1/8 java 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的產生。
Throwable :所有錯誤與異常的超類|--Error 錯誤|--Exception 編譯期異常,進行編譯java程序時出現的問題|--RuntimeException 運行期異常,java程序運行過程中出現的問題

3、異常與錯誤的區別

  • ?異常:表示程序在編譯、運行期間發生的某種異常(XXXException),我們可以對異常進行具體的處理。若不處理異常,程序將結束運行。
public static void main(String[] args) {int[] arr = new int[3];System.out.println(arr[3]); // 該句運行時,發生了ArrayIndexOutOfBoundsException,// 由于沒有處理異常,導致程序無法運行,程序結束}
  • 錯誤:指程序在運行期間發生了某種錯誤(XxxError),Error錯誤通常沒有具體的處理方式,程序將會結束運行。Error錯誤的發生往往都是系統級別的問題,我們無法針對處理,只能修改代碼。
public static void main(String[] args) {int[] arr = new int[100 * 1024 * 1024];// 該句運行時會發生內存溢出錯誤OutOfMemoryError,由于開辟了過大的數組空間//導致JVM在分配數組空間時超過了JVM內存空間,直接發生錯誤}

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的默認處理方式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?將異常對象的名稱、原因、位置等信息輸出到控制臺,同時結束程序。一旦有異常發生,其后面的代碼不再執行
  • 解決程序中異常的手動方式
  • 編寫處理代碼:try...catch...finally
  • 拋出throws.

  • 5、拋出異常thorw

    在java中,提供了一個throw關鍵字,用來拋出一個指定的異常對象。

    • 什么時候使用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... 處理掉異常后,程序可以繼續執行
    public static void main(String[] args) {int[] arr = new int[3];try {System.out.println(arr[4]);}catch (ArrayIndexOutOfBoundsException e){System.out.println("異常發生了..");}finally {arr = null; // 把arr數組指向null,通過垃圾回收器,進行內存垃圾的清除}System.out.println(arr);System.out.println("程序結束運行!");} }

    8、異常處理的組合方式

    • try..catch..finally:檢測異常,并傳遞給catch處理,最后在fianlly中進行資源釋放。
    • try..catch 組合:對代碼進行異常檢測,并對檢測到的異常傳遞給catch處理。
    • try..finally?組合:對代碼進行異常檢測,由于沒有catch,一般會被默認的JVM輸出。異常沒有捕獲處理,但是功能所開啟的資源需要進行關閉,所以finally的存在是關閉資源。
    • 一個try多個catch組合:對代碼快進行異常檢測,并對檢測到的異常傳遞給catch處理。對每種異常信息進行不同的捕獲處理。
    void show() {try{ throw new Exception();}catch(XxxException e){// 處理方式}catch(YyyException e){// 處理方式}catch(ZzzException e){// 處理方式} }注意事項: 這種異常處理方式,要求多個catch中的異常不能相同。

    多個catch處理的細節:

    多個catch小括號中,寫的是異常類的類名,它是由順序關系的

    • 平級異常——拋出的異常類之間,沒有繼承關系,沒有順序
    NullPointerException extends RuntimeException NoSuchException extends RuntimeException ArrayIndexOutOfBoundsException extends RuntimeException
    • 上下級關系的異常 ——越高級的父類,寫在越下面
    NullPointerException extends RuntimeException extends Exceptiontry {throw new Exception(); }catch(NullPointerException e){}catch(RuntimeException e){}catch(Exception e){ }

    9、finally代碼塊

    特點:被finally控制的語句體一定會執行

    作用:無論程序是否有異常出現,程序必須執行釋放資源。如:IO流操作、數據庫操作。


    10、調用拋出異常方法

    有 try...catch 和 throws 兩種

    在實際開發中使用哪種異常處理方式?

    • 能自己處理的盡量自己處理。(建議使用 try...catch)

    11、運行期異常

    1、概述:

    • RuntimeException和它的所有子類異常,都屬于運行期異常? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如
    • ArrayIndexOutOfBoundsException,NullPointerException 等都屬于運行時期異常

    2、特點:

    • 方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常。
    • 運行時期異常一旦發生,需要程序人員修改源代碼。
    • 設計原因:運行異常,不能發生,但如果發生了,程序人員要停止程序,修改源代碼。運行異常一旦發生,后面的代碼沒有執行的意義。

    12、方法重寫時異常的處理

    • 子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或該異常的的子類,獲取不聲明。
    class Fu{public void method() throws RuntimeException{} }class Zi extends Fu{public void method() throws RuntimeException{} // 拋出父類一樣的異常//public void method() throws NullPointerException{} // 拋出父類異常//public void method(){} }
    • 當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集
    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 {} // 拋出父類異常中的一部分 }
    • 當覆蓋的方法沒有異常聲明時,子類覆蓋時無法聲明異常
    class Fu{public void method(){} }class Zi extends Fu{public void method() throws Exception{} // 錯誤的方式 }
    • ?父類或接口中,沒有聲明異常,但子類覆蓋方法時發生了異常,怎么辦?

    ? ? ? ? 無法進行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():返回該異常的名稱與詳細信息字符串
    public class ExceptionDemo {public static void main(String[] args) {try{Demo demo = null;if(demo == null){throw new NullPointerException("出現空指針異常");}}catch (NullPointerException e){String message = e.getMessage();System.out.println("getMessage():"+message);String s = e.toString();System.out.println("toString():"+s);System.out.println("printStackTrace():");e.printStackTrace();}} }

    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程序基础——异常的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。