更好地理解檢查與。 未經檢查的異常——如何在 Java 中更好地處理異常?
已發表: 2014-09-15檢查異常
什麼是 Java 編程語言中的檢查異常。 用簡單的語言:在編譯時檢查的異常稱為檢查異常。 其中一些在下面提到。 如果在您的代碼中,如果某些方法拋出checked exception
, 那麼該方法必須要么handle the exception
,要么必須使用throws
關鍵字指定異常。
- IO異常
- SQL異常
- 數據訪問異常
- ClassNotFoundException
- 調用目標異常
- 格式錯誤的 URL 異常
我們來看一個例子:
在下面的示例中,我們將獲取站點“Crunchify.com”的內容並在控制台中打印它。 在此操作期間,Java 程序將在下面突出顯示的行處拋出MalformedURLException
或IOException
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } in . close ( ) ; return sb . toString ( ) ; } } |
有兩種方法可以解決這個問題。 在代碼中Add throws clause
或Add Try, Catch block
來解決它。 這是一個更新的代碼。
- 修改第 16 和 20 行並添加
throws IOException
- 在 26,42,43 上添加 try catch 塊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) throws IOException { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) throws IOException { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; try { URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } } catch ( IOException e ) { // TODO: Consume and Throw an error with detailed message. } in . close ( ) ; return sb . toString ( ) ; } } |

未經檢查的異常
Java中的未經檢查的異常是那些NOT verified during Compile time
其處理的異常。 這些異常是由於糟糕的編程而發生的。
該程序不會給出編譯錯誤。
所有未經檢查的異常都是RuntimeException
類的直接子類。
Simple Example
:您創建了接受用戶輸入的在線表單。 它是自由文本形式。 在電子郵件字段、用戶名字段或電話號碼字段的情況下,使用可能會輸入任何錯誤的值。
如果您沒有在客戶端進行驗證,那麼在生產中運行應用程序時有更多可能獲得運行時驗證異常。 DB 操作或將字段從一種格式轉換為另一種格式可能會引發錯誤。
以下是未檢查異常的類型:
- 空指針異常
- ArrayIndexOutOfBound
- IllegalArgumentException
- 非法狀態異常
最讓我煩惱的是 NullPointer Exception。 上週我寫了一篇關於 NPE 的詳細文章。
總共提供了 8 種不同的技巧來避免 NPE。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; try { String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } catch ( ArrayIndexOutOfBoundsException e ) { System . out . println ( "ArrayIndexOutOfBoundException appears here. Better handle it in code above :)" + e ) ; } } } |
在 Java 7 中,您可以在單個Catch block
中處理多個異常。 您可以將第 13 行從上面的行更改為下面。
1 |
} catch ( ArrayIndexOutOfBoundsException | NumberFormatException e ) { |
總而言之,Checked 和 Unchecked Exception 都使用關鍵字try, catch
和finally
來處理。
在功能方面 Checked 和 Unchecked Exception 是相同的。