CodeGym /مدونة جافا /Random-AR /جافا حاول - قبض
John Squirrels
مستوى
San Francisco

جافا حاول - قبض

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

جافا حاول التقاط الكتلة

عند حدوث خطأ، تتوقف Java عادة وتقوم بإنشاء رسالة خطأ. تسمى هذه العملية "Java تطرح استثناءً". توفر Java تسهيلات خاصة للتعامل مع الاستثناءات. واحد منهم هو محاولة...القبض...أخيرًا البناء. إليك بناء جملة محاولة الحظر، وحظر الالتقاط، وأخيرًا الحظر.
//try block
try {
  // Block of code to try
}
//try catch
catch(Exception e) {
  // Block of code to handle errors
}
finally {
 // Optional block of code
          }
عند حدوث استثناء في كتلة المحاولة، ينتقل التحكم إلى كتلة الالتقاط، والتي يمكنها التعامل مع الاستثناء. إذا لم يتم العثور على مثل هذا الحظر، يتم عرض رسالة استثناء غير معالج للمستخدم ويتم إيقاف تنفيذ البرنامج. لمنع مثل هذا التوقف الطارئ، تحتاج إلى استخدام كتلة Try..catch. جافا حاول - التقط - 1

باختصار حول المحاولة، والقبض، وأخيرا، يلقي الكلمات الرئيسية

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

مثال سهل على البناء حاول الالتقاط

لنفترض أن لدينا برنامجًا به بعض المصفوفات.
public class TryTest {
   public static void main(String[] args) {
       int[] myArray = new int[5];
       myArray[7] = 8;
       System.out.println(myArray[7]);
   }
}
نظرًا لأننا نحاول الوصول إلى عنصر مصفوفة بفهرس غير موجود، فسيخرج البرنامج مع ظهور خطأ:
استثناء في مؤشر الترابط "الرئيسي" java.lang.ArrayIndexOutOfBoundsException: الفهرس 7 خارج الحدود للطول 5 في أيام.TryTest.main(TryTest.java:6) انتهت العملية برمز الخروج 1
دعونا نعدل هذا البرنامج ونتعامل مع هذا الاستثناء من خلال محاولة الالتقاط. أولاً يأتي محاولة الحظر، ثم يأتي لاحقًا — التقاط الحظر.
//try catch example
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (Exception myEx) {
           System.out.println("The exception was handled...");
       }

       System.out.println("This is the end of the program...");
   }
}
الآن تغير الإخراج:
تمت معالجة الاستثناء... هذه نهاية البرنامج... انتهت العملية برمز الخروج 0 انتهت العملية برمز الخروج 0
في هذه الحالة، تم إكمال البرنامج بشكل صحيح، يتم عرض رسالتنا على الشاشة. تتم الإشارة إلى الإنهاء الصحيح للبرنامج بالرمز 0 في نهاية العملية، بينما غير صحيح - 1. عند استخدام كتلة محاولة...التقاط، يتم تنفيذ جميع العبارات بين عبارات المحاولة والالتقاط أولاً. في حالة حدوث استثناء في كتلة المحاولة، يتوقف أمر التنفيذ العادي وينتقل إلى عبارة الالتقاط. ولذلك عندما يصل تنفيذ البرنامج إلى الأرقام[7]=8; في السطر، سيتوقف البرنامج وينتقل إلى كتلة الالتقاط. في حالتنا، قمنا بإعلان المتغير myEx بالنوع Exception. هذه هي الفئة الأساسية لجميع الاستثناءات، وبالتالي يمكن أن تكون مختلفة. على سبيل المثال، هناك استثناءات مسؤولة عن تجاوزات المكدس، وتجاوز فهرسة المصفوفة، كما في حالتنا، والإشارة إلى Null، وما إلى ذلك. إذا لم نكن قد خمننا نوع الاستثناء، لكان البرنامج قد انتهى بشكل غير صحيح أيضًا. ومع ذلك، اخترنا نوع الاستثناء لتبسيط المثال، وهو الفئة الأساسية لجميع الاستثناءات. لذا فإن عبارة الالتقاط (Exception myEx) ستتعامل مع جميع الاستثناءات تقريبًا. معالجة الاستثناء في هذه الحالة بعد اكتمال كتلة الالتقاط، يواصل البرنامج عمله، وتنفيذ جميع التعليمات الأخرى بعد كتلة الالتقاط. إذا كنت تريد رؤية الاستثناءات التي حدثت، فيمكنك جعل البرنامج يطبع تتبع المكدس لاستدعاءات الطريقة. هذا ما يفعله JVM عند حدوث استثناء لم يتم اكتشافه: فهو يوقف تنفيذ البرنامج، ويطبع تتبع المكدس بعد تنفيذ كود الكتلة النهائية، إذا كان موجودًا.
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (Exception myEx) {

         myEx.printStackTrace();
       }

       System.out.println("This is the end of the program...");
   }
}
تتلخص معالجة الاستثناء في هذه الحالة في طباعة مكدس تتبع الأخطاء على وحدة التحكم باستخدام طريقة printStackTrace() المحددة في فئة الاستثناء .
java.lang.ArrayIndexOutOfBoundsException: الفهرس 7 خارج الحدود للطول 5 في أيام.TryTest.main(TryTest.java:7) هذه هي نهاية البرنامج... انتهت العملية برمز الخروج 0
ومع ذلك، تم إنهاء البرنامج بشكل صحيح.

أخيراً! بعد اصطياد

في المثال وفي تعريفات الكلمات الرئيسية لمعالجة الاستثناءات، ذكرنا الكتلة النهائية. إنه اختياري، ولكن إذا كان موجودًا، فسيتم تنفيذه بغض النظر عن نتائج كتلة المحاولة. دعونا نغير نوع الاستثناء إلى NullPointerException.
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (NullPointerException myEx) {
           System.out.println("The exception was handled...");

       }

       finally{
           System.out.println(" finally");
       }

       System.out.println("This is the end of the program...");
   }
}
هنا هو الإخراج:
استثناء في مؤشر الترابط "الرئيسي" java.lang.ArrayIndexOutOfBoundsException: الفهرس 7 خارج الحدود للطول 5 في أيام.TryTest.main(TryTest.java:7) أخيرًا انتهت العملية برمز الخروج 1
بالمناسبة، يمكننا تحديد نوع الاستثناء ليكون صحيحا. هنا هو IndexOutOfBoundsException.
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (IndexOutOfBoundsException myEx) {
           System.out.println("The exception was handled...");

       }

       finally{
           System.out.println(" finally");
       }

       System.out.println("This is the end of the program...");
   }
}
في هذه الحالة سيكون الناتج كما يلي:
تمت معالجة الاستثناء... أخيرًا هذه نهاية البرنامج... انتهت العملية برمز الخروج 0

ما هي طريقة عمل الاستثناءات؟

النقطة المهمة هي أن كل هذه الكلمات -catch، throw، throws لا يمكن استخدامها إلا مع java.lang.Throwable أو مشتقاتها. على سبيل المثال، يمكنك القيام بذلك:
public class MyClass {
    public static void main(String[] args) {
        try {
        } catch (Throwable thr) {
}
    }
}
ومع ذلك، لا يمكنك أن تفعل ذلك مثل هذا:
public class MyClass {
public static void main(String[] args) {
        try {
        } catch (String thr) {
}
    }
}
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION