java中异常处理机制
文章目錄
- 一 認識常見異常
- 1 除0異常(算術異常)
- 2 數組越界異常
- 3 空指針異常
- 二 異常的體系
- 三 異常的用法(try-catch語句)
- 1概述與代碼理解
- 2 注意事項
- 3 finally語句
- 4 異常的傳遞
- 5 throw與throws關鍵字
- 四 自定義異常
- 注意事項
- 結語
一 認識常見異常
在你所寫過的代碼中,你已經接觸過一些異常了,我們可以通過一些簡單的代碼讓我們理解一些簡單的異常
1 除0異常(算術異常)
public class winning {public static void main(String[] args) {System.out.println(10/0);} }我們都知道0是不能作為除數的,那么在這里作為除數運行之后結果如下:
畫出圈的地方就是我們異常的一個種類,稱為算術異常
2 數組越界異常
public class winning {public static void main(String[] args) {int[] array = {1,2,3};System.out.println(array[4]);} }運行結果:
3 空指針異常
public class winning {public static void main(String[] args) {int[] array = null;System.out.println(array[0]);} }運行結果:
二 異常的體系
Exception是我們所有異常的父類,其中Error以及RuntimeException是我們平時所說的一個非受查異常(運行時異常),其他的異常為受查異常(編譯時異常),前面介紹的幾種常見的異常,就是RuntimeException的子類。
對于這些異常的處理,我們建議統一利用try-catch去處理,而且catch處理異常時,如果有父子類的異常,我們應該要遵循先寫子類的異常,在寫父類的異常。
三 異常的用法(try-catch語句)
1概述與代碼理解
1 對于編寫了一段代碼,如果其中的一行發生了異常,那么之后的語句就不再執行(這是因為沒有自己處理異常,那么就會交給JVM來處理)
2 對于使用try-catch語句來處理異常,把有可能出現異常的語句放在try中,如果try語句中的一行發生了異常,那么try語句中的下一行將不執行,但不影響后面的語句執行
3 對于try-catch語句,catch后面要跟著異常的類型,以及要相對應的定義一個變量。
運行結果:
2 注意事項
1 try-catch語句不能單獨使用,必須聯合起來處理異常
2 可以有多個catch,但不能有多個try
3 catch中可以寫多個異常的類型,類型之間需要利用|隔開,但是變量必須定義到所寫的最后一個類型的后面(也就是變量只能定義一個),但我們并不推薦這種寫法,最好就是一種類型對應一個catch
4 catch中如果沒有對應的異常類型,那么此時就會交給jvm去處理( catch 只能處理對應種類的異常)
3 finally語句
finally語句表示的是表示的善后工作,釋放資源
public class winning {public static void main(String[] args) {try {int[] array = null;System.out.println(array[0]);System.out.println("abc");}catch(NullPointerException e){e.printStackTrace();System.out.println("捕獲到空指針異常了");}finally {System.out.println("釋放資源");}} }1 其實無論是否存在異常, finally 中的代碼一定都會執行到,確保資源可以釋放
2 finally語句是按情況寫與不寫,不是一定要有才能處理異常
3 使用的過程中,要按照try-catch-finally的順序
利用try負責回收資源(了解)
此時我們可以把鼠標放到try這個關鍵字上,按下alt + enter,此時就有
這樣子就相當于交由try來負責回收了,但這并不代表每一個異常都可以,只要是try在IDEA中報出了警告,我們可以嘗試利用這樣的一種快捷鍵讓try去負責回收
finally注意事項
運行結果:
30
如果try語句中有返回值,以及finally語句中也有返回值,那么此時將會返回finally語句中的返回值,我們寫代碼的時候,不要使用這種寫法(try與finally中同時擁有返回值)。
4 異常的傳遞
異常是會隨著調用棧的調用而傳遞
public class winning {public static void main(String[] args) {try {func();}catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();}}public static void func(){int[] array = {1,2,3,4};System.out.println(array[29]);} }運行結果:
如果向上傳遞的沒有合適的方法處理異常,那么就會返回看上一個調用它的有沒有合適的方法處理異常,一直到main中也沒有合適的處理異常的方法,那么就只能由jvm來處理了
5 throw與throws關鍵字
對于throw關鍵字,我們可以通過這個關鍵字手動拋出異常
public class winning {public static void main(String[] args) {try {func(0);}catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();}}public static void func(int a){if (a==0){throw new NullPointerException("空指針異常了");}} }
throws 主要是用來提醒調用者,調用該方法可能會出現那些異常,需要進行處理
四 自定義異常
Java 中雖然已經內置了豐富的異常類, 但是我們實際場景中可能還有一些情況需要我們對異常類進行擴展, 創建符合我們實際情況的異常.
我們可以通過一個例子來說明一下:模擬用戶登錄,此時就可能拋出兩種異常,一種是用戶名錯誤異常,一種是密碼錯誤異常:
我們先寫出一段模擬登錄的代碼
定義拋出用戶名錯誤的異常類
//定義一個用戶名異常 class NameException extends RuntimeException{public NameException(String name){super(name);} }定義拋出密碼錯誤的異常
//定義一個密碼異常 class PasswordException extends RuntimeException{public PasswordException(String password){super(password);} }我們在進一步完善我們異常處理機制:
public class winning {private static final String ID ="java";private static final String Password = "666";public static void main(String[] args) {System.out.println("請輸入你的用戶名");Scanner scanner=new Scanner(System.in);String name = scanner.nextLine();System.out.println("請輸入你的密碼");String password = scanner.nextLine();if (!ID.equals(name)){throw new NameException("用戶名錯了");}if (!Password.equals(password)){throw new PasswordException("密碼有誤");}} }通過這個例子,讓我們了解什么是自定義異常類,如何使用異常類,當然以上代碼可以進行優化,可以利用設置一個login登錄函數,在利用try-catch進行捕獲異常。
注意事項
對于自定義異常類:
1 一定要繼承一個異常類(通常為Exception或者RunException)
2 繼承Exception說明該類是可受查的
3 繼承RunException說明該類是非受查類
結語
關于異常的認識,其實并沒有像其他語法一樣難理解,如果對你理解異常這一塊也有幫助,別忘了給博主點個👍👍哦,之后的學習將會更新一些數據結構的知識!!
總結
以上是生活随笔為你收集整理的java中异常处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象——多态,抽象类,接口(二)
- 下一篇: 栈与队列理解