معالجة الاستثناءات في Java [مع أمثلة]

نشرت: 2020-11-12

الاستثناءات هي الحدث غير المرغوب فيه وغير المتوقع لبرنامج لا يرغب فيه المبرمج أبدًا ولكن يتعين عليه التعامل معه مرات عديدة. الجانب المشرق هو أنه من الممكن باستخدام لغة Java الموجهة للكائنات للتخفيف من تلك الأحداث غير المرغوب فيها من خلال مفهوم يسمى "معالجة الاستثناءات في Java ". لا يصلح الاستثناء ولكنه يوفر طريقة بديلة للتعامل معه.

يمكن أن يكون هناك العديد من الأسباب لحدوث استثناء ، بما في ذلك إدخال بيانات غير صحيحة ، وفشل الأجهزة ، وفشل الاتصال ، وتعطل الخادم ، وما إلى ذلك. وبالتالي ، فإن معالجة الاستثناءات مهمة وستظل دائمًا مهمة في سياق تعلم Java لأنها تساعد على ضمان الوضع الطبيعي تدفق البرنامج في وقت وقوع حدث غير متوقع. قد يؤدي تجاهل الاستثناءات إلى تعطل البرنامج بالكامل وقد يؤدي إلى فقد البيانات.

الآن بعد أن حصلنا على فكرة حول الاستثناءات ومعالجة الاستثناءات ، دعنا نتعمق فيها بالتفصيل ونفهم أيضًا كيف تساعد Java في التعامل مع الاستثناءات.

قراءة: الاستثناءات الخاصة بالتعامل مع أسئلة المقابلة

جدول المحتويات

ما هي معالجة الاستثناءات؟

يمكن للمطور توقع الاستثناءات التي يمكن أن يطرحها جزء من التعليمات البرمجية أثناء وقت التشغيل. من أهم الأشياء التي يكتنفها الغموض أن العديد من المتعلمين هو أن جميع الاستثناءات تحدث أثناء وقت التشغيل وليس في وقت التجميع. يمكن لـ Java معالجة الاستثناءات أثناء وقت التشغيل فقط. هناك بعض الكلمات الأساسية المستخدمة في برنامج جافا لإنشاء كتلة معالج استثناء.

java.lang.Exception هي الفئة الأصلية لجميع فئات الاستثناءات. فئة الاستثناء هي فئة فرعية من فئة Throwable المضمنة وهي فئة فرعية من فئة الكائن . بصرف النظر عن الاستثناء ، يحتوي Throwable أيضًا على فئة أخرى مثل الخطأ وهو حالة غير طبيعية أثناء تنفيذ البرنامج والتي لا يمكن معالجتها بواسطة برامج Java والتي تعد الفرق الرئيسي بين الخطأ والاستثناءات.

كما هو موضح في الشكل أعلاه ، هناك فئتان رئيسيتان من الاستثناءات في Java. في القسم التالي ، سنلقي نظرة مفصلة على أنواع الاستثناءات في Java.

استثناءات Java

الأسباب الجذرية للاستثناءات هي الأسباب التي يسببها المبرمج أو الموارد المادية التي فشلت بسبب بعض الأسباب. بناءً على ذلك ، هناك فئتان رئيسيتان من الاستثناءات في Java كما يلي التفاصيل التالية:

  1. استثناء محدد
  2. استثناء لم يتم التحقق منه

1. استثناء محدد

تُعرف الاستثناءات التي تم التحقق منها باسم "استثناءات وقت الترجمة" حيث يتم التحقق منها أثناء التجميع بواسطة المترجم لمراقبة ما إذا كان المبرمج يتعامل مع الاستثناء. ثم يعرض النظام خطأ تجميع.

بعض الأمثلة على هذه الاستثناءات هي IOException أو قراءة: أفكار مشروع جافا للمبتدئين

2. استثناء غير محدد

تسمى الاستثناءات التي لم يتم التحقق منها "استثناءات وقت التشغيل" لأنها تحدث أثناء وقت تشغيل البرنامج. عادةً ما يتم تجاهل الاستثناءات التي لم يتم التحقق منها أثناء التجميع ولا يتم التحقق منها.

يمكن أن تكون أمثلة هذه الاستثناءات أخطاء في البرنامج مثل الأخطاء المنطقية ، أو استخدام واجهات برمجة التطبيقات غير الصحيحة التي لا يتحكم فيها المبرمج وتتطلب تصحيح مسؤول النظام.

فحص مقابل استثناء لم يتم التحقق منه

نقاط التفريق استثناء محدد استثناء غير محدد التعامل مع الوقت يتم فحص الاستثناءات المحددة ومعالجتها في وقت التجميع. لم يتم التحقق من الاستثناءات التي لم يتم التحقق منها في وقت التجميع.
تحديد الاستثناء يعطي البرنامج خطأ تجميع إذا ألقى الأسلوب استثناء محدد. يقوم البرنامج بترجمة جيدة لأن المترجم لا يمكنه التحقق من الاستثناء.
ميراث لا يرثون فئة RuntimeException. هم الفئات الفرعية لفئة RuntimeException.
دور المطور يمكن للمطورين التعامل معها. لا يمكن للمطورين التعامل معها.

يعد فهم الاستثناءات هو الخطوة الأساسية قبل التعامل معها.

كيف تساعد Java في معالجة الاستثناءات؟

الآن بعد أن علمنا أن هناك نوعين من الاستثناءات في Java بمعنى محدد وغير محدد. إذا كانت إحدى الطرق ترمي استثناءً محددًا ، فيجب التعامل معه باستخدام كتلة try-catch أو الإعلان عن الكلمة الأساسية "throws" لتجنب حدوث خطأ في الترجمة في البرنامج.

مثال على استثناء محدد:

هذا برنامج لقراءة ملف يسمى "Java". هناك ثلاثة أماكن يتم فيها طرح استثناء محدد:

  1. FileInputStream: يستخدم لتحديد مسار الملف واسم رمي FileNotFoundException .
  2. طريقة القراءة (): تؤدي قراءة محتوى الملف إلى ظهور IOException ؛

ثالثا. طريقة الإغلاق (): يؤدي إغلاق تدفق إدخال الملف إلى ظهور IOException .

استيراد java.io. * ؛

مثال فئة {

الرئيسية العامة الثابتة الفراغ ( سلاسل سلسلة [])

{

FileInputStream fis = خالية ؛

/ * المُنشئ FileInputStream (اسم ملف)

* يطرح استثناءًا محددًا FileNotFoundException * /

fis = new FileInputStream ( “B: /java.txt” ) ؛

int ك ؛

/ * أسلوب قراءة () رميات فئة FileInputStream

* استثناء محدد: IOException

* /

بينما ((k = fis.read ())! = - 1 )

{

النظام . خارج . طباعة (( شار ) ك) ؛

}

/ * تغلق طريقة الإغلاق () تدفق إدخال الملف

* يرمي IOException * /

fis.close () ؛

}

}

مخرجات البرنامج أعلاه:

تم العثور على استثناء في الموضوع "الرئيسي" java.lang. خطأ : مشاكل الترجمة التي لم يتم حلها :

تم العثور على استثناء غير معالج FileNotFoundException

تم العثور على استثناء لم تتم معالجته IOException

تم العثور على استثناء لم تتم معالجته IOException

سبب هذا الخطأ التجميعي: عدم التصريح أو معالجة الاستثناءات.

يجب أن تقرأ: مشاريع Java GitHub

طرق معالجة الاستثناءات

هناك طريقتان يمكن من خلالهما معالجة الاستثناءات الموضحة أدناه:

الأسلوب 1: التصريح عن الكلمة الأساسية استثناء "رميات"

في البرنامج أعلاه ، جميع الاستثناءات الثلاثة المحددة موجودة داخل الطريقة الرئيسية (). وبالتالي ، فإن إحدى طرق تجنب خطأ الترجمة هي إعلان الاستثناء في الطريقة باستخدام الكلمة الأساسية "رميات". نظرًا لأن IOException هي فئة أصل من FileNotFoundException ، فإنها ستغطي ذلك أيضًا.

برنامج محدث باستخدام رميات الكلمة:

استيراد java.io. * ؛

مثال فئة {

يلقي الفراغ الرئيسي العام الثابت ( String args []) IOException

{

FileInputStream fis = خالية ؛

fis = new FileInputStream ( “B: /java.txt” ) ؛

int ك ؛

بينما ((k = fis.read ())! = - 1 )

{

النظام . خارج . طباعة (( شار ) ك) ؛

}

fis.close () ؛

}

}

انتاج:

اعرض محتوى الملف على الشاشة.

الطريقة 2: معالجة الاستثناءات باستخدام قوالب try-catch.

يعد هذا أسلوبًا أكثر تقدمًا لما سبق وأحد أفضل ممارسات معالجة الاستثناءات . كود البرنامج الذي تم تغييره بما في ذلك كتل try-catch هو كما يلي:

استيراد java.io. * ؛

مثال فئة {

الرئيسية العامة الثابتة الفراغ ( سلاسل سلسلة [])

{

FileInputStream fis = خالية ؛

حاول {

fis = new FileInputStream ( “B: /java.txt” ) ؛

} catch ( FileNotFoundException fnfe) {

النظام . out .println ( "الملف ليس" +

"موجودة في المسار المحدد" ) ؛

}

int ك ؛

حاول {

بينما ((k = fis.read ())! = - 1 )

{

النظام . خارج . طباعة (( شار ) ك) ؛

}

fis.close () ؛

} catch ( IOException ioe) {

النظام . out .println ( "خطأ الإدخال / الإخراج" + ioe) ؛

}

}

}

انتاج:

سيعرض هذا الرمز في النهاية محتوى الملف.

مثال على استثناء لم يتم التحقق منه

لم يتم التحقق من الاستثناءات التي لم يتم التحقق منها في وقت التجميع. لن يقدم البرنامج خطأ في الترجمة إذا لم يتم الإعلان عنه أو معالجته وسيعمل بشكل جيد. وظيفة المطور هي التنبؤ بالظروف التي قد تحدث مسبقًا مسببة مثل هذه الاستثناءات والتعامل معها. جميع الاستثناءات التي لم يتم التحقق منها هي فئات فرعية من فئة RuntimeException .

مثال فئة {

الرئيسية العامة الثابتة الفراغ ( سلاسل سلسلة [])

{

عدد العمليات 1 = 10 ؛

عدد العمليات 2 = 0 ؛

/ * قسمة أي رقم على 0

* سيلقي ArithmeticException

* /

الدقة int = num1 / num2 ؛

النظام . out . println (res) ؛

}

}

سيتم ترجمة الكود بنجاح باستخدام هذا الكود ، ولكن أثناء وقت التشغيل ، فإنه سيرمي ArithmeticException حيث لا يتم التحقق من الاستثناءات التي لم يتم التحقق منها في وقت الترجمة. دعنا نلقي نظرة على مثال آخر.

مثال فئة {

الرئيسية العامة الثابتة الفراغ ( سلاسل سلسلة [])

{

int arr [] = { 1 ، 2 ، 3 ، 4 ، 5 } ؛

/ * المصفوفة بها 5 عناصر لكننا نريد ذلك

* عرض قيمة العنصر الثامن. سوف يرمي

* مؤشر مجموعة خارج الحدود استثناء

* /

النظام . out .println (arr [ 7 ]) ؛

}

}

سيتم أيضًا ترجمة هذا الرمز بنجاح لأن ArrayIndexOutOfBoundsException هو استثناء لم يتم التحقق منه.

هنا ، للتعامل مع الاستثناءات غير المحددة ، يجب أن تكون هناك رسالة استثناء معروضة للمستخدم الذي يريد عرضها ، لكنها غير موجودة في المصفوفة.

التعامل مع استثناء الكود أعلاه مع كتلة try-catch

مثال فئة {

العامة الثابتة الفراغ الرئيسي ( سلاسل سلسلة []) {

حاول {

int arr [] = { 1 ، 2 ، 3 ، 4 ، 5 } ؛

النظام . out .println (arr [ 7 ]) ؛

}

catch ( ArrayIndexOutOfBoundsException e) {

النظام . out .println ( "الفهرس المحدد غير موجود" +

"في المصفوفة." ) ؛

}

}

}

انتاج:

الفهرس المحدد غير موجود في الصفيف .

ملاحظة: يمكن أن يكون هناك العديد من الكتل catch داخل كتلة try للتعامل مع الاستثناءات المختلفة.

الطريقة الثالثة : استخدام الكلمة الأساسية "أخيرًا"

يحدث أحيانًا أن رمز ما يحتاج إلى التنفيذ حتى في حالة حدوث استثناء. هذا هو المكان الذي تستخدم فيه الكلمة النهائية . هذا هو رمز نموذجي مع الكلمة الأساسية "أخيرًا".

public int getPlayerScore (String playerFile)

يلقي FileNotFoundException {

محتويات الماسح الضوئي = لا شيء ؛

يحاول {

المحتويات = ماسح ضوئي جديد ( ملف جديد (playerFile)) ؛

إرجاع Integer.parseInt (content.nextLine ()) ،

} أخيرًا {

إذا (المحتويات! = خالية ) {

content.close () ؛

}

}

}

هنا ، تشير الكتلة النهائية إلى الكود الذي نريد تشغيل Java عند محاولة قراءة الملف.

حتى إذا تم طرح FileNotFoundException ، فستقوم Java باستدعاء محتويات أخيرًا .

يمكننا معالجة الاستثناء من خلال تعديل الكود على النحو التالي:

PlayerScore int العامة (String playerRuns) {

محتويات الماسح الضوئي

يحاول {

المحتويات = ماسح ضوئي جديد (ملف جديد (playerRuns)) ؛

إرجاع Integer.parseInt (content.nextLine ()) ،

} catch (FileNotFoundException noFile) {

logger.warn ("الملف غير موجود.") ؛

العودة 0 ؛

} أخيرا {

يحاول {

إذا (المحتويات! = خالية) {

content.close () ؛

}

} catch (IOException ioexc) {

logger.error ("تعذر إغلاق القارئ" ، ioexc) ؛

}

}

}

خاتمة

مع هذه المقالة ، حاولنا التعرف على أساسيات الأخطاء والاستثناءات ومعالجة الاستثناءات في Java . نأمل أن يمنحك هذا الدليل فكرة جيدة عن هذه الميزة الفريدة التي تقدمها Java ويمكنك الآن التعامل مع الاستثناءات والتعافي منها بشكل أفضل. خاتمة

توفر Java طرقًا للتعامل مع الاستثناءات من الخاصة إلى العامة. الاستثناءات التي لا يمكن توقعها بسهولة مسبقًا تسمى استثناءات لم تتم معالجتها. يوفر الحصول على جميع الاستثناءات رؤية لفريق التطوير حول جودة الكود والأسباب الجذرية للأخطاء التي يمكن إصلاحها بسرعة.

إذا كنت مهتمًا بمعرفة المزيد حول Java ، وتطوير المكدس الكامل ، فراجع دبلوم PG upGrad & IIIT-B في تطوير البرامج ذات المكدس الكامل. تم تنسيقه بعناية للمحترفين ويضمن دعمًا مهنيًا بدرجة 360 ويتضمن مشاريع حية للعمل عليها. بنهاية الدورة ، ستكون قادرًا على تصميم وبناء تطبيقات مثل Swiggy و IMDB وما إلى ذلك.

ألا يبدو هذا مثيرا! -

كن مطورًا للمكدس الكامل

الترقية و IIIT-BANGALORE دبلوم PG في تطوير البرامج
يتعلم أكثر