ความเข้าใจที่ดีขึ้นเกี่ยวกับ Checked Vs. ข้อยกเว้นที่ไม่ได้ตรวจสอบ - วิธีจัดการกับข้อยกเว้นที่ดีกว่าใน Java ได้อย่างไร
เผยแพร่แล้ว: 2014-09-15ตรวจสอบข้อยกเว้น
Checked Exception คืออะไรในภาษาการเขียนโปรแกรม Java ในภาษาง่าย ๆ : ข้อยกเว้นซึ่งถูกตรวจสอบในเวลาคอมไพล์ที่เรียกว่าการตรวจสอบข้อยกเว้น สิ่งเหล่านี้บางส่วนถูกกล่าวถึงด้านล่าง หากในรหัสของคุณหากบางวิธีส่ง checked exception
แล้ว จากนั้นเมธอดต้อง handle the exception
หรือต้องระบุข้อยกเว้นโดยใช้คีย์เวิร์ด throws
- IOException
- SQLException
- DataAccessException
- ClassNotFoundException
- InvocationTargetException
- MalformedURLException
ลองมาดูตัวอย่าง:
ในตัวอย่างด้านล่าง เรากำลังจะได้รับเนื้อหาของเว็บไซต์ “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
- เพิ่มลอง catch block บน 26,42,43
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 ( ) ; } } |

ข้อยกเว้นที่ไม่ได้เลือก
Unchecked Exception ใน Java คือ Exceptions ที่ NOT verified during Compile time
ข้อยกเว้นเหล่านี้เกิดขึ้นเนื่องจากการเขียนโปรแกรมไม่ถูกต้อง
โปรแกรมจะไม่ทำให้เกิดข้อผิดพลาดในการรวบรวม
ข้อยกเว้นที่ไม่ได้ตรวจสอบทั้งหมดเป็นคลาสย่อยโดยตรงของคลาส RuntimeException
Simple Example
: คุณได้สร้างแบบฟอร์มออนไลน์ที่ยอมรับการป้อนข้อมูลของผู้ใช้ มันเป็นรูปแบบข้อความฟรี การใช้อาจป้อนค่าที่ไม่ถูกต้องในกรณีของฟิลด์อีเมลหรือฟิลด์ชื่อผู้ใช้หรือฟิลด์หมายเลขโทรศัพท์
หากคุณไม่มีการตรวจสอบที่ฝั่งไคลเอ็นต์ มีความเป็นไปได้มากกว่าที่จะได้รับ Runtime Validation Exception ในขณะที่เรียกใช้แอปพลิเคชันในการผลิต ข้อผิดพลาดอาจเกิดขึ้นจากการดำเนินการ DB หรือการแปลงฟิลด์จากรูปแบบหนึ่งเป็นอีกรูปแบบหนึ่ง
ด้านล่างนี้คือประเภทของ Unchecked Exceptions:
- NullPointerException
- ArrayIndexOutOfBound
- IllegalArgumentException
- IllegalStateException
สิ่งที่ทำให้ฉันรำคาญที่สุดคือ 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 ) { |
โดยสรุป ข้อยกเว้นที่ตรวจสอบแล้วและไม่ได้ตรวจสอบจะได้รับการจัดการโดยใช้คำหลัก try, catch
และ finally
ในแง่ของ Functionality Checked และ Unchecked Exception จะเหมือนกัน