تعد معالجة الاستثناءات في Java إحدى الوسائل الفعالة لمعالجة أخطاء وقت التشغيل بحيث يمكن الحفاظ على التدفق المنتظم للتطبيق. فهو يعالج أخطاء وقت التشغيل مثل NullPointerException ArrayIndexOutOfBoundsException وما إلى ذلك. للتعامل مع هذه الأخطاء بشكل فعال، توفر Java كلمتين رئيسيتين throw و throws.
رمي جافا
يتم استخدام الكلمة الأساسية throw في Java لطرح استثناء بشكل صريح من طريقة ما أو أي كتلة من التعليمات البرمجية. يمكننا طرح استثناء محدد أو غير محدد. تُستخدم الكلمة الأساسية throw بشكل أساسي لطرح استثناءات مخصصة.
بناء الجملة:
يرمي مثال
حيث يكون المثيل كائنًا من النوع Throwable (أو فئاته الفرعية مثل الاستثناء).
مثال:
طرح استثناء حسابي جديد('/ بصفر');
ولكن هذا الاستثناء أي يجب أن يكون المثيل من النوع قابل للرمي أو فئة فرعية من قابل للرمي .
يتوقف تدفق تنفيذ البرنامج فورًا بعد تنفيذ بيان الرمي وأقرب مرفق يحاول يتم فحص الكتلة لمعرفة ما إذا كانت تحتوي على ملف يمسك البيان الذي يطابق نوع الاستثناء. إذا وجد تطابقًا يتم التحكم فيه، فسيتم نقله إلى ذلك البيان وإلا فسيتم إرفاقه بعد ذلك يحاول يتم فحص الكتلة وما إلى ذلك. إذا لم يكن هناك مطابقة يمسك تم العثور عليه، ثم سيقوم معالج الاستثناء الافتراضي بإيقاف البرنامج.
سونو نيغام
مثال: يوضح هذا المثال المكان الذي تم فيه طرح استثناء تم اكتشافه وإعادة طرحه داخل إحدى الطرق.
Javaclass Geeks { static void fun() { try { throw new NullPointerException('demo'); } catch (NullPointerException e) { System.out.println('Caught inside fun().'); throw e; // rethrowing the exception } } public static void main(String args[]) { try { fun(); } catch (NullPointerException e) { System.out.println('Caught in main.'); } } }
الإخراج
Caught inside fun(). Caught in main.
توضيح: يوضح المثال أعلاه استخدام الكلمة الأساسية throw لرمي NullPointerException بشكل صريح. تم اكتشاف الاستثناء داخل هزار() الطريقة وإعادة طرحها حيث يتم اكتشافها بعد ذلك في الطريقة الرئيسية ().
مثال: يوضح هذا المثال استثناء حسابي.
Java// Throwing an arithmetic exception class Geeks { public static void main(String[] args){ int numerator = 1; int denominator = 0; if (denominator == 0) { // Manually throw an ArithmeticException throw new ArithmeticException('Cannot divide by zero'); } else { System.out.println(numerator / denominator); } } }
الإخراج:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.ArithmeticException: Cannot divide by zero
at Geeks.main(Geeks.java:9)
توضيح: يوضح المثال أعلاه استثناءً باستخدام throw حيث يتم طرح ArithmeticException بشكل صريح بسبب القسمة على صفر.
رميات جافا
رميات هي كلمة أساسية في Java يتم استخدامها في توقيع إحدى الطرق للإشارة إلى أن هذه الطريقة قد تطرح أحد استثناءات النوع المدرجة. يجب على المتصل بهذه الأساليب معالجة الاستثناء باستخدام كتلة محاولة الالتقاط.
بناء الجملة:
اكتب اسم الأسلوب (المعلمات) يلقي قائمة الاستثناءات
أنماط التصميم جافا
حيث Exception_list عبارة عن قائمة مفصولة بفواصل تضم جميع الاستثناءات التي قد تطرحها إحدى الطرق.
في أحد البرامج، إذا كانت هناك فرصة لظهور استثناء، فإن المترجم دائمًا يحذرنا منه ويجب علينا التعامل مع هذا الاستثناء المحدد وإلا فسنحصل على خطأ في وقت الترجمة يفيد بأنه يجب اكتشاف الاستثناء غير المُبلغ عنه XXX أو الإعلان عن طرحه. لمنع هذا الخطأ في وقت الترجمة، يمكننا التعامل مع الاستثناء بطريقتين:
- باستخدام محاولة الصيد
- باستخدام رميات الكلمة الرئيسية
يمكننا استخدام الكلمة الأساسية throws لتفويض مسؤولية معالجة الاستثناء إلى المتصل (قد يكون طريقة أو JVM) ثم تكون طريقة المتصل مسؤولة عن معالجة هذا الاستثناء.
مثال 1: استثناء لم تتم معالجته
Javaclass Geeks { public static void main(String[] args) { Thread.sleep(10000); System.out.println('Hello Geeks'); } }
الإخراج:
error: unreported exception InterruptedException; must be caught or declared to be thrownتوضيح: في البرنامج أعلاه، نتلقى خطأ في وقت الترجمة لأن هناك فرصة للاستثناء إذا كان مؤشر الترابط الرئيسي سيدخل في وضع السكون، وتحصل سلاسل الرسائل الأخرى على فرصة تنفيذ الطريقة الرئيسية () والتي ستتسبب في InterruptedException.
مثال 2: الاستخدام throws للتعامل مع الاستثناء
class Geeks { public static void main(String[] args) throws InterruptedException { Thread.sleep(10000); System.out.println('Hello Geeks'); } }
الإخراج:
Hello Geeksتوضيح: في البرنامج أعلاه باستخدام الكلمة الأساسية throws تعاملنا مع InterruptException وسوف نحصل على الإخراج كما مرحبا المهوسون.
مثال 3: رمي استثناء معthrows
class Geeks { static void fun() throws IllegalAccessException { System.out.println('Inside fun(). '); throw new IllegalAccessException('demo'); } public static void main(String args[]) { try { fun(); } catch (IllegalAccessException e) { System.out.println('Caught in main.'); } } }
الإخراج
Inside fun(). Caught in main.
توضيح: المثال أعلاه يطرح IllegalAccessException من إحدى الطرق ويتعامل معه في الطريقة الرئيسية باستخدام كتلة محاولة الالتقاط.
الفرق بين الرمي والرمي
الاختلافات الرئيسية بين الرمي والرميات في Java هي كما يلي:
يرمي | رميات |
|---|---|
يتم استخدامه لرمي استثناء بشكل صريح. | يتم استخدامه للإعلان عن أن الطريقة قد تطرح استثناءً واحدًا أو أكثر. |
يتم استخدامه داخل طريقة أو كتلة من التعليمات البرمجية. | يتم استخدامه في توقيع الطريقة. |
يمكنه طرح الاستثناءات المحددة وغير المحددة. | يتم استخدامه فقط للاستثناءات المحددة. لا تتطلب الاستثناءات التي لم يتم التحقق منها رميات |
الأسلوب أو الكتلة يطرح الاستثناء. | يكون المتصل الخاص بالأسلوب مسؤولاً عن معالجة الاستثناء. متناظر في جافا |
يوقف التدفق الحالي للتنفيذ على الفور. | يفرض على المتصل التعامل مع الاستثناءات المعلنة. |
طرح استثناء حسابي جديد('خطأ'); | الفراغ العام myMethod() يلقي IOException {} |