فهم أفضل على Checked Vs. الاستثناءات التي لم يتم التحقق منها - كيفية التعامل مع الاستثناء بطريقة أفضل في Java؟
نشرت: 2014-09-15استثناء محدد
ما هو فحص الاستثناء في لغة برمجة جافا. بلغة بسيطة: استثناء يتم التحقق منه في وقت الترجمة يسمى "استثناء محدد". بعض هذه مذكورة أدناه. إذا كان في التعليمات البرمجية الخاصة بك إذا ألقت بعض الطرق checked exception
، ثم يجب أن handle the exception
أو يجب أن تحدد الاستثناء باستخدام كلمة throws
.
- IOException
- SQLException
- DataAccessException
- درجة بدون استثنائات
- الاحتجاج استثناء الهدف
- تصور خاطئ
دعنا نلقي نظرة على المثال:
في المثال أدناه ، سنحصل على محتويات موقع "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
- أضف كتلة try catch على 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 ( ) ; } } |

استثناء غير محدد
الاستثناءات التي لم يتم التحقق منها في Java هي تلك الاستثناءات التي NOT verified during Compile time
. تحدث هذه الاستثناءات بسبب البرمجة السيئة.
البرنامج لن يعطي خطأ في الترجمة.
جميع الاستثناءات التي لم يتم التحقق منها هي فئات فرعية مباشرة من فئة RuntimeException
.
Simple Example
: لقد أنشأت نموذجًا عبر الإنترنت يقبل مدخلات المستخدم. إنه نص حر. قد يدخل الاستخدام أي قيمة خاطئة في حالة حقل البريد الإلكتروني ، أو حقل اسم المستخدم أو حقل رقم الهاتف.
إذا لم يكن لديك التحقق من الصحة من جانب العميل ، فهناك المزيد من الاحتمالات للحصول على استثناء التحقق من وقت التشغيل أثناء تشغيل التطبيق في الإنتاج. قد ينتج خطأ عن طريق عملية DB أو تحويل الحقل من تنسيق إلى آخر.
فيما يلي نوع الاستثناءات التي لم يتم التحقق منها:
- NullPointerException
- ArrayIndexOutOfBound
- غير الشرعيين استثناء حجة
- استثناء الدولة غير القانوني
أكثر ما يزعجني هو 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
.
من حيث الوظائف التي تم فحصها والاستثناءات التي لم يتم التحقق منها هي نفسها.