java中的異常處理是處理異常引起的運行時錯誤的強大機製之一。異常處理在軟件開發中扮演著重要的角色。本文幫助您理解java異常、java中的異常、java異常處理、java異常層次結構、java中的異常類型等等。
什麼是Java中的異常處理?
java中的異常處理有助於最小化異常並幫助從異常中恢複。它是處理運行時異常的強大機製之一,並使其沒有bug。異常處理有助於維護程序的流程。異常處理被定義為可能在運行時發生並幹擾程序正常流程的異常條件。
還讀:Java初學者教程
什麼是異常?
期望是在執行程序時發生的意外事件,它會擾亂代碼的正常流程。
java中的異常處理示例:
比方說,
............如果發生異常,JVM將處理它並退出進程。語句聲明語句
對於處理異常,有2可能的方法
1.JVM
如果沒有顯式處理異常,則JVM負責處理異常。
一旦異常被處理,JVM將停止程序,不再執行代碼
- 例子:
進口java.util。*;class Main {public static void Main (String[] args) {System.out.println(5/0);system . out。println(“項目結束!”);}}
運行時錯誤:
Exception: /在main .main(File.java:5)
2.開發人員
開發人員可以顯式地編寫處理異常的實現。一旦處理了異常,代碼的正常執行將繼續進行。
更可取的:處理異常,以確保您的代碼正常執行。
Java異常層次結構
異常層次結構,下麵是Java處理層次結構中的異常處理。
- Throwable- - - - - -
- 它是java中異常層次結構的根類。
- 它在java中。朗包。
- 錯誤- - - - - -
- Throwable的子類。
- 由不受某人控製並取決於環境的異常狀態組成
- 它們無法處理,總是會導致程序停止。
- 例如:在無限循環或遞歸中可能發生的StackOverFlowError
- 異常- - - - - -
- Throwable的子類。
- 由可以顯式處理的異常條件組成。
- 如果處理了異常,那麼我們的代碼將繼續平穩地執行。
Java中的異常類型
- 已檢查的異常
- 那些在編譯時被檢查的異常包括被檢查的異常。
- 它們是Exception的子類,除了RuntimeException。
- 如果不處理它們,程序將無法編譯。
- 例如:IOException, ClassNotFoundException等。
- 未經檢查的異常
- 在運行時檢查的異常包括未檢查的異常。
- 它們是RuntimeException的子類。
- 如果沒有顯式處理,它們會給出運行時錯誤。
- 示例:arith婧exception, NullPointerException等。
已檢查異常與未檢查異常的區別
已檢查的異常 | 未經檢查的異常 |
在編譯時發生。 | 在運行時發生。 |
編譯器檢查已檢查異常。 | 編譯器不檢查異常。 |
可以在編譯時處理。 | 在編譯期間無法捕獲或處理。 |
JVM要求捕獲和處理異常。 | JVM不需要捕獲和處理異常。 |
檢查異常的例子- ' File Not Found exception ' | 未經檢查的異常示例- ' No Such Element Exception ' |
Java異常指數
Java異常關鍵字
java中的異常處理通過五個關鍵字管理:try、catch、throw、throws和finally。下麵是在Java中處理異常時使用的5個關鍵字
關鍵字 | 描述 |
試一試 | 這個關鍵字用於指定一個塊,這個塊後麵必須跟catch或finally。也就是說,我們不能單獨使用try塊。 |
抓 | 該關鍵字前麵必須有一個try塊來處理異常,後麵可以有一個final塊。 |
最後 | 無論是否處理異常,此關鍵字都用於執行程序。 |
扔 | 此關鍵字用於拋出異常。 |
拋出 | 該關鍵字用於聲明異常。 |
Java try - catch塊
try - catch語法:
try{} catch(異常){}
- try - catch的例子:
公共類ExceptionDemo{公共靜態void main (String[] args) {int a=10;(int i = 3;我> = 0;我——)嚐試{System.out.println (a / i);}捕捉(ArithmeticException e) {System.out.println (e);}}}
輸出:
3 5 10 java.lang. arith婧exception: / by 0
- 試一試塊包含可能引發異常的代碼。不要在try中寫入任何額外的內容,因為如果發生異常,異常之後的語句將不會被執行。Try後麵必須緊跟著catch或最後阻塞。
公共類ExceptionDemo{公共靜態void main (String[] args) {int a=10;(int i = 3;我> = 0;我——)嚐試{System.out.println (a / i);}}}
編譯時錯誤:
Prog.java:5: error: 'try'沒有'catch', 'finally'或資源聲明try{^ 1錯誤
- catch塊用於捕獲try塊中的語句拋出的異常。catch必須緊跟try,否則將給出編譯時錯誤。
公共類ExceptionDemo{公共靜態void main (String[] args) {int a=10;(int i = 3;我> = 0;我——)嚐試{System.out.println (a / i);} system . out。Println(“在嚐試和捕獲之間”);抓住(ArithmeticException e) {System.out.println (e);}}}
編譯時錯誤:
prog.java:5: error: 'try' without 'catch', 'finally'或資源聲明try{^ prog.java:9: error: 'catch' without 'try' catch(arithticticexception e){^ 2 errors . {^ 2 errors . {^ 2 errors . {^ 2 errors .
事情要記住:
不要在語句後麵保留任何容易發生異常的代碼。因為如果發生異常,它將直接跳轉到catch或最終塊,忽略try塊中的所有其他語句。
class Main {public static void Main (String[] args) {try {System.out.println(4/0);//將不會打印System.out。println(“年底嚐試!”);} catch(arithticticexception e) {System.out. exception。println(“除以0”);}}}
輸出:
除以0
- 在捕獲塊中捕獲異常時,可以直接獲得異常的類或其超類。
例子:確切的例外
class Main {public static void Main (String[] args) {try{System.out.println(4/0);} // arith婧異常catch(arith婧異常e){System.out. catch。println(“除以0”);}}}
輸出:
除以0
示例:精確異常的超類
class Main {public static void Main (String[] args) {try{System.out.println(4/0);} // arithticexception catch(Exception e)的超類{System.out. Exception。println(“除以0”);}}}
輸出:
除以0
Java多捕獲塊
如果有多個捕獲,則必須維護從子類到超類的層次結構。
不正確的:
class Main {public static void Main (String[] args) {try{System.out.println(4/0);}catch(異常e) {System.out.}println("異常:除0");}catch(arithticticexception e) {System.out. exception。println(" aritharithticexception:除0");}}}
編譯時錯誤:
prog.java:11: error: exception arith婧異常已經被捕獲}catch(arith婧異常e) ^ 1錯誤
正確的:
class Main {public static void Main (String[] args) {try{System.out.println(4/0);}catch(arithticticexception e) {System.out. exception。println(" aritharithticexception:除0");}catch(異常e) {System.out.}println("異常:除0");}}}
輸出:
算術異常:除以0
Java嵌套試
當try塊中有另一個try塊時:
class Main {public static void Main (String[] args) {try{try{int[] a={1,2,3};System.out.println ([3]);} catch(ArrayIndexOutOfBoundsException e){係統。println(“界外”);} System.out.println (4/0);} catch(arithticticexception e) {System.out. exception。println(" aritharithticexception:除0");}}}
輸出:
算術異常:除以0
注意:如果我們把外部嚐試的代碼放在內部嚐試之前,那麼如果發生了異常,它將忽略整個內部嚐試,並直接移動到它的catch塊。
class Main {public static void Main (String[] args) {try{System.out.println(4/0);嚐試{int [] = {1,2,3};System.out.println ([3]);} catch(ArrayIndexOutOfBoundsException e){係統。println(“界外”);}} catch(arithticticexception e) {System.out. System.out.println(" aritharithticexception:除0");}}}
輸出:
算術異常:除以0
Java Finally塊
包含無論是否引發異常都必須執行的代碼。它包含文件釋放、關閉連接等代碼。
- 最後的工作流程:
- 例子:
class Main {public static void Main (String[] args) {try{System.out.println(4/0);}catch(異常e) {System.out.println(e);}最後{System.out。println(“最後執行”);} System.out.println(“結束”);}}
輸出:
java.lang. arith婧exception: /由0最終執行結束
最後,即使不處理異常,也會執行。在停止程序之前,JVM檢查是否存在“finally”塊。
class Main {public static void Main (String[] args) {try{System.out.println(4/0);最後}{System.out.println(“清潔 .......");}}}
運行時錯誤:
java.lang. arithmei Exception: /在main .main(File.java:4)
輸出:
清洗……
Java Final vs Finally vs Finalize
最後 | 最後 | 完成 |
Final用於對類、方法和變量施加限製 | Finally用於編碼,無論異常是否被處理,它都將被執行。 | Finalize用於在垃圾收集之前執行清理處理。 |
Final是java中的一個關鍵字 | 最後是java中的一個塊 | Finalize是java中的一個方法 |
在調用時執行Final。 | 最後在" try-catch "塊後執行。 | Finalize在對象銷毀之前執行。 |
Java把關鍵字
它是一個用於顯式拋出異常的關鍵字。
根據我們的邏輯,我們可以在應該發生異常的地方使用throw。
例子:
公共類ExceptionDemo{靜態無效canVote(int年齡){if(年齡<18)try{拋出新的異常();}(異常e) {system . out。Println(“你還不是成年人!”);} system . out。println(“你可以投票!”);} public static void main (String[] args) {canVote(20);canVote (10);}}
輸出:
你可以投票!你還不是成年人!
Java將關鍵字
- 當被調用方不想處理異常,而希望將處理異常的責任擴展到函數的調用方時,使用Throws關鍵字。
- 基本上是說代碼可以拋出哪種類型的異常,並依賴於調用者來處理它。
- 它用於處理已檢查的異常,因為編譯器在處理異常之前不允許編譯代碼。
例子:
public類ExceptionDemo {static void func(int a)拋出異常{System.out.println(10/a);} public static void main (String[] args) {try{func(10);func (0);}(異常e) {system . out。Println(“不能除零”);}}}
輸出:
1不能被0除
如果calllee可以拋出多個異常,那麼所有的異常都將被同時拋出。
進口java.util。*;public類ExceptionDemo {static void func(int a,int b)拋出arithticexception, ArrayIndexOutOfBoundsException{System.out.println(10/a);int [] arr = {1,2,3};System.out.println (arr [b]);} public static void main (String[] args) {Scanner in=new Scanner(System.in);(int i = 0;我< 3,我+ +){{func (in.nextInt (), in.nextInt ());} (ArithmeticException e) {system . out。Println(“不能除零”);} (ArrayIndexOutOfBoundsException e) {system . out。println(“界外!”);} } } }
輸入:
2 1 0 1 2 3
輸出:
52不能被0除5越界!
Java Throw vs Throws
扔 | 拋出 |
此關鍵字用於顯式拋出異常。 | 該關鍵字用於聲明異常。 |
已檢查異常不能僅使用throw傳播。 | 檢查異常可以通過拋出來傳播。 |
throw後麵跟著一個實例,並與一個方法一起使用 | 拋出後跟類,並與方法簽名一起使用。 |
不能拋出多個異常。 | 您可以聲明多個異常 |
Java自定義異常
您可以創建自己的異常,並給出它應該如何行為的實現。您的異常將表現得像子類的exception。
語法:
類youreexception擴展了Exception{}
- 例子:
- 比方說,你正在與一家航空公司合作
- 您現在在行李托運處,根據規定,每位旅客可以托運15公斤行李。
- 所以現在超過15公斤的體重對我們來說是一個不正常的情況,換句話說,這是一個例外
- 這是基於邏輯的異常,因此我們將創建自定義異常WeightLimitExceeded
- 根據語法,它將擴展Exception。
- 我們定義的構造函數將在拋出異常時立即被調用
- 我們必須顯式地拋出異常,因此我們將使用throw關鍵字。
- 使用throws關鍵字是根據我們的需要。如果我們處理的異常被拋出,那麼我們可以避免拋出,否則我們將使用拋出並在調用者中處理它。
實現:
進口java.util。*;類WeightLimitExceeded擴展異常{WeightLimitExceeded(int x){System.out.print(Math.abs(15-x)+" kg: ");}}類Main {void validWeight(int weight)拋出WeightLimitExceeded{if(weight>15)拋出新的WeightLimitExceeded(weight);其他的system . out。println(“你準備好要飛了!”);} public static void main (String[] args) {main ob=new main ();掃描儀在=新掃描儀(係統);for(int i=0;i<2;i++){try{ob.validWeight(in.nextInt());}捕捉(WeightLimitExceeded e) {System.out.println (e);} } } }
輸入:
20 7
輸出:
你已經準備好要飛了!
java中使用方法重寫的異常處理
Java中使用方法覆蓋的異常處理是一個重寫的方法,該方法聲明拋出異常,並聲明它可以拋出該異常的相同異常或該異常的子類型。
要在Java中處理異常,必須遵循三條重要規則。如下圖所示。
java中異常處理的優缺點
java中異常處理的優點
- 將錯誤處理代碼與“常規”代碼分離
- 在調用堆棧中傳播錯誤
- 錯誤類型的分組和區分
java中異常處理的缺點
- 經曆不必要的開銷
- 不了解應用程序是如何真正工作的
- 用吵鬧的事件填滿你的日誌
- 無法專注於真正重要的事情
至此,本文關於java中的異常處理的內容就結束了。我們希望您現在已經清楚了java中異常處理的概念。如果您希望了解更多關於java編程語言的知識,請登錄我們的免費網站java編程課程並在你的職業生涯中繼續前進。
還看: