معالجة الاستثناءات في Java
⚡ ملخص ذكي
Java توفر معالجة الاستثناءات آلية منظمة لإدارة أخطاء وقت التشغيل التي تعطل سير البرنامج الطبيعي. وتستخدم الكلمات المفتاحية try وcatch وfinally وthrow وthrows لاكتشاف الحالات الاستثنائية وعزلها والتعافي منها مع الحفاظ علىping تطبيقات قوية ويمكن التنبؤ بها.
ما هو الاستثناء في Java?
An استثناء في Java هو حدث يقاطع تنفيذ تعليمات البرنامج ويعطل سير عمله الطبيعي. وهو كائن يغلّف معلومات حدث الخطأ الذي وقع داخل دالة، ويتم تمريره إلى نظام التشغيل. Javaتُستخدم الاستثناءات بشكل أساسي للإشارة إلى أنواع مختلفة من حالات الخطأ حتى يتمكن المطورون من الاستجابة لها بطريقة مُتحكم بها.
هناك فئتان رئيسيتان من الأخطاء في Java:
- تجميع أخطاء الوقت
- أخطاء وقت التشغيل
يمكن تصنيف أخطاء وقت الترجمة إلى نوعين إضافيين:
- أخطاء في بناء الجملة
- الأخطاء الدلالية
مثال على الأخطاء النحوية:
بدلا من التصريح int a; لقد أعلنت عن طريق الخطأ أنه in a;، الأمر الذي سيؤدي إلى ظهور خطأ في المترجم.
مثال على الأخطاء الدلالية: لقد قمت بتعريف متغير int a; وبعد بعض أسطر التعليمات البرمجية، تعلن مرة أخرى عن عدد صحيح كـ int a;يتم تسليط الضوء على كل هذه الأخطاء عند تجميع الكود.
مثال على أخطاء وقت التشغيل
يُشار إلى خطأ وقت التشغيل باسم استثناءالاستثناء هو أي حدث يعيق سير تنفيذ البرنامج بشكل طبيعي. ومن أمثلة الاستثناءات: الاستثناء الحسابي، واستثناء المؤشر الفارغ، واستثناء القسمة على صفر، وغيرها الكثير. Java هي ظروف غالباً ما تكون خارجة عن سيطرة المطور المباشرة.
انقر اضغط هنا إذا لم يكن من الممكن الوصول إلى الفيديو
لماذا نحتاج إلى معالجة الاستثناءات؟
لنفترض أنك قمت ببرمجة برنامج للوصول إلى خادم. الأمور تسير على ما يرام أثناء التطوير.ping الكود في بيئة محلية ذات ظروف مضبوطة.
أثناء تشغيل البرنامج فعلياً، قد يكون الخادم معطلاً. وعندما يحاول برنامجك الوصول إليه، يتم طرح استثناء، وإذا لم تتم معالجته بشكل صحيح، فسيتوقف البرنامج فجأة.
كيفية التعامل مع الاستثناء في Java
لقد رأينا حتى الآن أن الاستثناءات غالبًا ما تكون خارجة عن سيطرة المطور. ومع ذلك، فإن إلقاء اللوم على المشكلات البيئية في فشل الكود ليس حلاً حقيقيًا. أنت بحاجة إلى برمجة قوية تعالج الحالات الاستثنائية. يُعرف هذا النوع من الكود باسم معالج الاستثناءات.
في مثالنا، تعني معالجة الاستثناءات الجيدة أنه عندما يكون الخادم الأساسي معطلاً، يتصل البرنامج تلقائيًا بخادم احتياطي.
لتنفيذ ذلك، يمكنك كتابة كود للاتصال بالخادم باستخدام عبارات if وelse التقليدية. ستتحقق مما إذا كان الخادم معطلاً، وإذا كان كذلك، فستكتب كودًا للاتصال بخادم النسخ الاحتياطي. لا يُعد هذا التنظيم للكود باستخدام عبارات if وelse فعالاً عندما يحتوي الكود على عدة خوادم. Java الاستثناءات لكي يعلق.
class connect{ if(Server Up){ // code to connect to server } else{ // code to connect to BACKUP server } }
حاول استخدام كتلة Catch في Java
Java يوفر آلية مدمجة لمعالجة الاستثناءات تفصل المنطق العادي عن منطق استعادة الأخطاء.
- الكود العادي يذهب إلى أ ليرة تركية منع.
- يذهب رمز معالجة الاستثناء إلى ملف تخطف منع.
في مثالنا، سيحتوي قسم TRY على التعليمات البرمجية اللازمة للاتصال بالخادم. أما قسم CATCH فسيحتوي على التعليمات البرمجية اللازمة للاتصال بخادم النسخ الاحتياطي. في حال كان الخادم يعمل، سيتم تجاهل التعليمات البرمجية الموجودة في قسم CATCH. أما في حال كان الخادم معطلاً، فسيتم طرح استثناء، وسيتم تنفيذ التعليمات البرمجية الموجودة في قسم CATCH.
إذن، هكذا يتم التعامل مع الاستثناء في Java.
صيغة استخدام try و catch
try{ statement(s) } catch (exceptiontype name){ statement(s) }
مثال على كتلة Try Catch
الخطوة 1) انسخ الكود التالي إلى المحرر.
class JavaException { public static void main(String args[]){ int d = 0; int n = 20; int fraction = n/d; System.out.println("End Of Main"); } }
الخطوة 2) احفظ الملف وقم بتجميع الكود. شغّل البرنامج باستخدام الأمر java Javaاستثناء.
الخطوة 3) يظهر خطأ حسابي، قسمة على صفر، في السطر 5، ولا يتم تنفيذ السطر 6 مطلقًا.
الخطوة 4) والآن دعونا ندرس كيف ستساعدنا عبارة try و catch في التعامل مع هذا الاستثناء. سنضع سطر التعليمات البرمجية الذي تسبب في الاستثناء في محاولة ، متبوعًا ب قبض قم بنسخ الكود التالي إلى المحرر.
class JavaException { public static void main(String args[]) { int d = 0; int n = 20; try { int fraction = n / d; System.out.println("This line will not be Executed"); } catch (ArithmeticException e) { System.out.println("In the catch Block due to Exception = " + e); } System.out.println("End Of Main"); } }
الخطوة 5) احفظ الكود، ثم قم بتجميعه وتشغيله. ستحصل على المخرجات التالية.
كما تلاحظ، يتم التعامل مع الاستثناء، ويتم تنفيذ السطر الأخير من التعليمات البرمجية أيضًا. لاحظ أيضًا أن السطر 7 لن يتم تنفيذه لأن بمجرد رفع الاستثناء، ينتقل تدفق التحكم إلى كتلة الالتقاط.
ملاحظة: يحمل كائن ArithmeticException "e" معلومات حول الاستثناء الذي حدث، والذي يمكن أن يكون مفيدًا عند اتخاذ إجراءات الاسترداد.
Java التسلسل الهرمي لفئة الاستثناء
بعد تنفيذ عبارة catch واحدة، يتم تجاوز العبارات الأخرى، ويستمر التنفيذ بعد كتلة try و catch. يجب أن تتبع كتل catch المتداخلة التسلسل الهرمي للاستثناءات من الفئة الفرعية الأكثر تحديدًا إلى الفئة الأصلية الأكثر عمومية.
- جميع فئات الاستثناء في Java قم بتوسيع الفئة Throwable. تحتوي Throwable على فئتين فرعيتين، هما Error و Exception.
- تحدد فئة الخطأ الاستثناءات أو المشاكل التي لا يُتوقع حدوثها في ظل الظروف العادية في برنامجك، على سبيل المثال خطأ الذاكرة، أو خطأ الأجهزة، أو خطأ JVM.
- يمثل صنف الاستثناء الاستثناءات التي يمكن لبرنامجك التعامل معها، ويمكن لبرنامجك التعافي من هذه الاستثناءات باستخدام كتل try و catch.
- يُعدّ RuntimeException فئة فرعية من فئة Exception. تمثل الاستثناءات من هذا النوع استثناءات غير مُدققة تحدث أثناء التشغيل ولا يمكن اكتشافها أثناء الترجمة. ومن الأمثلة الجيدة على ذلك استثناء القسمة على صفر واستثناء المؤشر الفارغ.
- يتم إنشاء استثناء IOException أثناء عمليات الإدخال والإخراج.
- InterruptedException in Java يتم توليدها أثناء العمليات متعددة الخيوط عندما تتم مقاطعة أحد الخيوط.
مثال: تداخل كتل try و catch
الخطوة 1) انسخ الكود التالي إلى المحرر.
class JavaException { public static void main(String args[]) { try { int d = 1; int n = 20; int fraction = n / d; int g[] = { 1 }; g[20] = 100; } /*catch(Exception e){ System.out.println("In the catch block due to Exception = "+e); }*/ catch (ArithmeticException e) { System.out.println("In the catch block due to Exception = " + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("In the catch block due to Exception = " + e); } System.out.println("End Of Main"); } }
الخطوة 2) احفظ الملف وقم بتجميع الكود. شغّل البرنامج باستخدام الأمر التالي: جافا Javaاستثناء.
الخطوة 3) تم إنشاء استثناء ArrayIndexOutOfBoundsException. غيّر قيمة المتغير int d إلى 0. احفظ الكود، ثم قم بتجميعه وتشغيله.
الخطوة 4) يجب إنشاء استثناء حسابي (ArithmeticException).
الخطوة 5) قم بإلغاء التعليق من السطر 10 إلى السطر 12. احفظ الكود وقم بتجميعه وتشغيله.
الخطوة 6) خطأ في التجميع؟ يعود ذلك إلى أن Exception هي الفئة الأساسية لـ ArithmeticException. أي استثناء يُثار بواسطة ArithmeticException يمكن معالجته أيضًا بواسطة فئة Exception. لذا، لن تُتاح لكتلة catch الخاصة بـ ArithmeticException فرصة التنفيذ، مما يجعلها زائدة عن الحاجة. ومن هنا يأتي خطأ الترجمة.
Java وأخيرا بلوك
الكتلة النهائية هي يتم تنفيذه بغض النظر عن الاستثناء الذي يتم طرحه في كتلة المحاولة. إنها اختياري يُستخدم مع كتلة try. أما كتلة finally فهي المكان المناسب لتحرير الموارد مثل اتصالات قواعد البيانات أو الملفات أو منافذ الشبكة.
try { statement(s) } catch (ExceptiontType name) { statement(s) } finally { statement(s) }
إذا تم طرح استثناء في كتلة المحاولة، فسيتم تنفيذ كتلة النهاية بعد اكتمال كتلة الالتقاط.
مثال على كتلة finally
الخطوة 1) انسخ الكود التالي إلى المحرر.
class JavaException { public static void main(String args[]){ try{ int d = 0; int n =20; int fraction = n/d; } catch(ArithmeticException e){ System.out.println("In the catch block due to Exception = "+e); } finally{ System.out.println("Inside the finally block"); } } }
الخطوة 2) احفظ الكود، وقم بتجميعه، ثم قم بتشغيله.
الخطوة 3) الناتج المتوقع: يتم تنفيذ كتلة finally على الرغم من حدوث استثناء.
الخطوة 4) غيّر قيمة المتغير d إلى 1. احفظ الكود وقم بتجميعه وتشغيله، ولاحظ الناتج.
ممارسات لـ Java معالجة الاستثناء
اتباع بعض القواعد المجربة سيساعدك في الحفاظ على Java كود مرن، قابل للقراءة، وسهل التصحيح:
- قم بالتقاط الاستثناء الأكثر تحديدًا أولاً، ثم الاستثناءات الأكثر عمومية، للحفاظ على سلامة التسلسل الهرمي للاستثناءات.
- تجنب استخدام كتل catch الفارغة. على الأقل، قم بتسجيل الاستثناء حتى لا يضيع السبب الجذري.
- استخدم كتلة finally أو حاول مع الموارد لتحرير الملفات والمآخذ واتصالات قاعدة البيانات.
- قم برمي الاستثناءات التي تم التحقق منها فقط عندما يكون بإمكان المتصل التعافي بشكل معقول، واستخدم الاستثناءات التي لم يتم التحقق منها لأخطاء البرمجة.
- قم بتغليف الاستثناءات منخفضة المستوى في استثناء تجاري ذي معنى للحفاظ على استمرارية واجهة برمجة التطبيقاتtracنظيف.
- لا تتجاهل استثناء المقاطعة (InterruptedException) بصمت في التعليمات البرمجية متعددة الخيوط، بل استعد علامة المقاطعة بدلاً من ذلك.








