1. التعامل مع الأحداث
في الواقع ، يُعتقد بشكل طبيعي اسم معالجة الأحداث في آلية استجابة الرسائل في MFC. بقدر ما أفهم ، ينبغي اعتبارهم وضع البرتقال الجنوبي والحمضيات الشمالية. أظن أن "الزجاجة الجديدة" لمعالجة الأحداث في جافا يجب أن تكون استجابة الرسالة في MFC.
ما يسمى "الأحداث" هي تغييرات مثل مفاتيح لوحة المفاتيح ، ونقرات الماوس ، وما إلى ذلك التي تتسبب في تغيير حالة معينة بسبب الإجراءات أو ما يجب الرد عليه وفقًا لذلك. يمكننا تقسيم الأحداث في Java إلى عدة فئات: الأزرار والماوس ولوحة المفاتيح والنافذة والأحداث الأخرى.
نموذج معالجة الأحداث
1. نموذج معالجة الأحداث الموروثة (JDK1.0)
في JDK1.0 ، تعتمد معالجة الأحداث على الميراث. يتم إرسال الأحداث إلى المكون أولاً ثم يتم نشرها لأعلى على طول مستوى الحاوية. ستستمر الأحداث التي لا تتم معالجتها بواسطة المكون تلقائيًا في الانتشار إلى حاوية المكون. -يبدو أن هذا يتماشى مع ترتيب استجابة الأحداث الأصلي أو آلية الاستجابة المتعددة الأشكال في MFC ، ويبدو أن آلية معالجة الأحداث القائمة على الوكيل المذكورة لاحقًا تتوافق مع آلية رد الاتصال MFC.
طرق علاج محددة
استدعاء طريقة الإجراء () أو طريقة المقبض () للحصول على الأحداث التي تحدث عند تشغيل البرنامج ، ويتم التعامل مع جميع الأحداث التي تحدث في المكون في هذه الطريقة.
2. نموذج معالجة الأحداث القائم على الوكيل (JDK1.1)
في هذا النموذج ، يتم إرسال الأحداث مباشرة إلى المكون الذي ينتج هذا الحدث.
لكل مكون ، يتم تسجيل فئة واحدة أو أكثر تسمى المستمعين ، والتي تحتوي على معالجات الأحداث التي تتلقى هذا الحدث ومعالجته.
المستمع هو فئة تنفذ واجهة المستمع. الأحداث هي الكائنات التي تم الإبلاغ عنها فقط للمستمعين المسجلين. يحتوي كل حدث على واجهة مستمع مقابلة.
عند النقر فوق كائن الزر مع الماوس ، سيتم إرسال حدث ActionEvent. سيتم استلام هذا الحدث ActionEvent بواسطة طريقة ActionPerformed () لجميع ActionListener المسجلة باستخدام طريقة AddActionListener ().
ميزات نموذج معالجة الأحداث القائم على الوكيل ① لن تتم معالجة الأحداث بشكل غير متوقع. في نموذج هرمي ، قد ينتشر الحدث إلى الحاوية ويتم معالجته على مستوى غير متوقع.
② من الممكن إنشاء واستخدام فئة المحول لتصنيف إجراءات الحدث.
③ هو مفضي إلى توزيع العمل على فئات مختلفة.
ركز على تعلم نموذج معالجة الحدث هذا
3. الأحداث
ثلاثة عناصر من معالجة الأحداث.
(1) مصدر الحدث هو مصدر الحدث هو مولد حدث ، مثل الأزرار والنوافذ وحقول النص.
(2) نوع الحدث يتم تغليف جميع الأحداث في Java في فصل ، وتركز فئات الأحداث هذه في حزمة Java.awt.event. ترث جميع فئات الأحداث فئة AWTEVENT وطريقة - GETOUCE () ، والتي تُرجع الكائن حيث حدث الحدث.
(3) بعد حدوث أنواع مختلفة من الأحداث في مستمع الحدث ، يتلقى مستمع الحدث الحدث ويدعو طريقة معالجة الأحداث المقابلة. جميع مستمعي الأحداث هم في الواقع واجهة في حزمة java.awt.event ، حيث يقدمون واجهة java.util.eventListener. المستمعون من أنواع الأحداث المختلفة لديهم طرق مختلفة.
خطوات معالجة الأحداث ① يضيف البرنامج حزمة java.awt.event:
استيراد java.awt.event ؛
② سجل مستمع حدث لكائن مصدر الحدث المطلوب:
مصدر الحدث Object.addxxxListener (xxxListener) ؛
③ تنفيذ الطريقة المقابلة. إذا كانت واجهة المستمع تحتوي على طرق متعددة ، فأنت بحاجة إلى تنفيذ جميع أمثلة الأسلوب: B2.AdCtingListener (هذا)
4. محولات الأحداث (محول)
عبء عمل تنفيذ جميع طرق كل واجهة مستمع عالية جدًا. للراحة ، توفر لغة Java فئة المحولات لتنفيذ الفصول التي تحتوي على طرق متعددة.
يمكن للمستمع الذي تحدده أن يرث فئة المحول وتجاوز الأساليب التي تحتاجها فقط.
على سبيل المثال ، فإن المستمع المقابل لحدث النافذة هو WindowListener ، والذي يجب أن ينفذ طرقًا متعددة ، بما في ذلك windowpened () ، و windowclosed () ، و windowclosing () ، و windowiconfied () ، و windowdeiconfied () ، و windowactivated () ، و windowdeactivated () ، مما يزيد من عبء عمل البرمجة غير الضروري.
إذا كنت ترث WindowAdapter ، فأنت بحاجة فقط إلى تنفيذ واحدة أو عدة طرق ، ولا تحتاج إلى تنفيذ جميع الطرق. العديد من الأمثلة التالية تنفذ طريقة واحدة فقط من Windowsclosing () ، مع الغرض من الخروج من النظام عند إغلاق النافذة.
4.1 التعامل مع أحداث الأزرار
الحدث الذي يحدث عند النقر فوق الزر هو حدث حركة. فئة الحدث المقابلة لحدث الإجراء هو فئة ActionEvent. مستمع الحدث المقابل لحدث الإجراء هو: ActionListener
الطرق الرئيسية للمستمعين:
ActionPerformed (ActionEvent e) مشروع التشغيل الذي يسمى عند حدوث حدث عمل:
الخطوة الأولى هي تسجيل مستمع حدث الإجراء AddActionListener (ActionListener).
الخطوة الثانية هي تنفيذ طريقة واجهة ActionListener: ActionPerformed (ActionEvent E)
4.2 التعامل مع أحداث الماوس
مصدر الحدث الذي يؤدي إلى حدث الماوس عادة ما يكون حاوية. عندما يدخل الماوس أو يترك الحاوية ، أو ينقر على الماوس ، يسحب الماوس ، إلخ. في الحاوية ، سيحدث حدث الماوس. فئة الحدث المقابلة لحدث الماوس هو فئة Mouseevent.
طرق في فئة Mouseevent:
Getx () يحصل على إحداثي X من الماوس
gety () يحصل على إحداثي y من الماوس
GetPoint () يحصل على موضع الماوس ويتوافق حدث الماوس مع مستمعين للحدث: يتوافق Mouselistener (أو mouseadapter) مع حدث الماوس ، ويتوافق MousemotionListener (أو mousemotionadapter) مع حدث حركة الماوس.
الطريقة الرئيسية لموسيليستنر (أو mouseadapter)
Mousepracked (mouseevent e) كيفية التعامل مع الضغط على الماوس
MousereleSESS (mouseevent e) كيفية التعامل مع إطلاق الماوس
mouseentered (mouseevent e) كيفية التعامل مع الماوس عند الدخول
mouseexited (mouseevent e) كيفية التعامل مع الماوس عند المغادرة
mouseclicked (mouseevent e) كيفية التعامل مع النقر على الماوس
الطريقة الرئيسية لـ MousemotionListener (أو mousemotionadapter)
MouseMoved (mouseevent e) كيفية التعامل مع الماوس عند التحرك
mousedraged (mouseevent e) كيفية التعامل مع السحب الماوس
4.3 التعامل مع أحداث لوحة المفاتيح
عند الضغط على لوحة المفاتيح أو إطلاقها في مكون مع تركيز لوحة المفاتيح ، تحدث أحداث لوحة المفاتيح. فئة الحدث المقابلة لحدث لوحة المفاتيح هي فئة Keyevent
طرق Keyevent Class الرئيسية:
GetKeyCode () يحصل على رمز المفتاح المراد الضغط عليه أو إصداره
GetKeyText () يحصل على سلسلة من المفتاح المضغوط أو إصداره. مستمع الحدث المقابل لحدث لوحة المفاتيح هو: keylistener أو keyadapter
الطرق الرئيسية:
Keyypressed (keyevent e) كيفية التعامل عند الضغط على لوحة المفاتيح
keyreles (keyevent e) كيفية التعامل مع لوحة المفاتيح عند إطلاقها
4.4 التعامل مع أحداث النوافذ
فقط إذا كانت هناك نافذة وفئات ممتدة (الإطار ، مربع الحوار) ، وما إلى ذلك ، يمكن تشغيل أحداث النوافذ ، مما يشير إلى أن النافذة في حالة نشطة/غير صالحة ، أو أيقونة/حالة غير متوسطة ، أو حالة مفتوحة/قريبة ، إلخ.
الطرق الرئيسية:
windowpened (windowevent e) معالجة الأحداث من نافذة فتح
Windowclosed (WindowEvent E) معالجة الأحداث من نافذة الإغلاق
Windowsclosing (WindowEvent E) معالجة الأحداث الإغلاق للنافذة
معالجة الأحداث من حالة التنشيط النافذة (WindowEvent e) التنشيط
معالجة الأحداث مع الحالة غير الصالحة للنوافذ المنعطف (WindowEvent E)
4.5 التعامل مع الأحداث الأخرى
4.5.1 خانة الاختيار لخانة الاختيار ومعالجة أحداث زر الراديو هي ItemEvent:
مستمع الحدث المقابل لحدث الخيار هو: itemListener
طريقة:
يتم استدعاء itemStateChanged (itemevent e) عندما يحدث حدث الخيار 4.5.2 فئة الحدث المقابلة لحدث ضبط أحداث شريط التمرير هو فئة additmentevent:
مستمع الحدث الذي يتوافق مع حدث التعديل هو: AdquenterListener
طريقة:
يتم استدعاء AdquencmentValuechanged (endactmentevent e) عند حدوث حدث التعديل
4.5.3 فئة أحداث معالجة الأحداث في القائمة المنسدلة هي ItemVent:
مستمع الحدث المقابل لحدث الخيار هو: itemListener
طريقة:
يتم استدعاء itemStateChanged (itemevent e) عند حدوث إجراء في القائمة المنسدلة
(يمكن ملاحظة أن معالجة الأحداث في القائمة المنسدلة هي نفس نوع الحدث ، ومستمع الحدث وطريقة ، مثل معالجة الأحداث لخانة الاختيار ونوع الحدث ومستمع الحدث وطريقة معالجة الحدث لمربع الراديو)
4.5.4 معالجة أحداث الأحداث القائمة هي بشكل عام حدث يحدث عند النقر فوق عنصر قائمة.
هناك نوعان من عناصر القائمة:
حدث عمل Menuitem
مربعات الاختيارات ، حدث الخيار
تتمثل الخطوة الأولى في معالجة الأحداث لـ Menuitem في تسجيل مستمع الأحداث AddActionListener (ActionListener) لجميع عناصر قائمة Menuitem.
والخطوة الثانية هي تنفيذ طريقة ActionListener Interface: ActionPerformed (ActionEvent E). في هذه الطريقة ، استخدم E.GetSource () للحصول على عنصر القائمة المحدد من قبل المستخدم وأداء المعالجة المقابلة.
تتمثل الخطوة الأولى في معالجة الأحداث لـ CheckMenuitem في تسجيل مستمع حدث الخيار لجميع عناصر قائمة CheckMenuitem إلى AddItEmListener (itemListener).
الخطوة الثانية هي تنفيذ طريقة واجهة ItemListener: itemStateChanged (itemevent e). في هذه الطريقة ، استخدم E.GetSource () لتحديد عنصر القائمة من قبل المستخدم ، E.GetItem () للحصول على تسمية عنصر القائمة المحدد من قبل المستخدم ، و E.GetStateChange () للحصول على ما إذا كان تم تحديده وأداء المعالجة المقابلة.
2. الاستثناء معالجة
لن تتجاهل لغة البرمجة أو المبرمج الجيد معالجة الاستثناءات. كلغة برمجة شهيرة موجهة نحو الكائن ، Java ، فإن آلية معالجة الاستثناءات هي بطبيعة الحال واحدة من ميزاتها المهمة.
بشكل عام ، يتم وصف الاستثناءات على النحو التالي: أخطاء في البرمجة. ومع ذلك ، في الواقع ، يكون هذا الخطأ متكررًا للغاية ، مع العديد من الأنواع ، مثل: أخطاء التجميع وأخطاء التشغيل (على وجه التحديد ، يتم تقسيمها إلى: أخطاء تشغيل النظام وأخطاء التشغيل المنطقية. ما هي أخطاء تشغيل النظام نادراً ما تعتبر أخطاء البرمجة ، قبل ذلك)
في جافا ، استثناء هو فئة ترث من فئة رمي. يمثل كل فئة استثناء خطأ في التشغيل (ملاحظة: إنه خطأ في التشغيل). تحتوي فئة الاستثناء على معلومات حول خطأ العملية وطريقة التعامل مع الخطأ.
آلية معالجة جافا استثناء:
عندما يحدث خطأ في التشغيل المحدد أثناء عملية برنامج Java ، (أي عندما يكون للخطأ فئة استثناء يتوافق معها) ، سيقوم النظام بإنشاء كائن مقابل لفئة الاستثناء (ملاحظة: يطلق عليه إنشاء كائن فئة استثناء.) أي استثناء.
بمجرد إنشاء كائن استثناء ، يجب أن تكون هناك آلية مقابلة في النظام للتعامل معها للتأكد من عدم وجود حوادث أو حلقات ميتة أو أي أضرار أخرى لنظام التشغيل ، وبالتالي ضمان أمان تشغيل البرنامج بأكمله.
فصول الاستثناء والاستثناء:
خطأ: تم إنشاؤه وإلقاؤه بواسطة جهاز Java Virtual ، ولا يتعامل برنامج Java.
استثناء وقت التشغيل (أخطاء النظام مثل 0 ، شكاوى الصفيف تتجاوز النطاق): تم اكتشافه بواسطة النظام ، لا يمكن معالجة برنامج JAVA الخاص بالمستخدم ، وسلمها النظام إلى معالج الاستثناء الافتراضي (ملاحظة: هناك معالجة استثناء افتراضية).
استثناء (المشكلات في البرنامج ، يمكن التنبؤ بها): يتطلب برنامج التحويل البرمجي Java أن يقوم برنامج Java بالقبض على أو إعلان جميع الاستثناءات غير المحددة التي يقوم المستخدمون بإنشاء استثناءاتهم الخاصة.
مُنشئ فئة الاستثناء:
استثناء عام () ؛
استثناء عام (سلسلة S) ؛ يمكن قبول المعلومات التي تم تمريرها بواسطة معلمات السلسلة ، والتي عادة ما تكون وصفًا للخطأ المقابل للاستثناء.
يرث فئة الاستثناء أيضًا عدة طرق من الأب القابلة للترميح ، من بينها تلك التي تستخدم عادة:
1) السلسلة العامة tostring () ؛
تقوم طريقة ToString () بإرجاع سلسلة تصف معلومات فئة الاستثناء الحالية.
2) printstacktrace printstacktrace public void ؛
لا تحتوي طريقة PrintStackTrace () على قيمة إرجاع. تتمثل وظيفتها في إكمال عملية الطباعة وطباعة مسار استخدام المكدس لكائن الاستثناء الحالي على الإخراج القياسي الحالي (عادةً الشاشة) ، أي استدعاء البرنامج الذي يتم تنفيذ الكائنات أو الفئات التي يتم تنفيذها ، والتي يتم إنشاء طرق كائن الاستثناء أثناء العملية.
استثناء تشغيل محدد النظام
يتم تعريف بعض هذه الفئات الفرعية مسبقًا من قبل النظام وإدراجها في مكتبة فئة Java ، وتسمى استثناءات التشغيل المعرفة من قبل النظام
استثناءات محددة من قبل المستخدم
بالنسبة لأخطاء العملية الفريدة لتطبيق معين ، يحتاج المبرمجون إلى إنشاء فئات استثناء محددة من قبل المستخدم وكائنات الاستثناء في برنامج المستخدم وفقًا للمنطق الخاص للبرنامج. عادة ما تستخدم الاستثناءات المعرفة من قبل المستخدم كفئة الوالدين لفئة الاستثناء. ومع ذلك ، هناك مشكلة لم يتم فهمها بعد: كيف يعرف النظام أن الخطأ يحدث وأنه يمكن التعرف عليه؟ كيفية إنشاء كائنات فئة الاستثناء المقابلة؟ كيف تعرف كيفية حل كائن فئة الاستثناء باستخدام الطريقة المقابلة؟ هل كل كائن فئة استثناء يتعامل مع الاستثناء المقابل له طريقة معالجة استثناء واحدة فقط؟ ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――�
عند إنشاء استثناءات محددة من قبل المستخدم ، تكون المهام التالية مطلوبة بشكل عام:
1) إعلان فئة استثناء جديدة ، بحيث تأخذ فئة الاستثناء أو فئة استثناء النظام الحالية أو استثناء المستخدم كفئة الوالدين.
2) تحديد السمات والأساليب لفئة الاستثناء الجديدة ، أو الزائد على سمات وطرق الفئة الأصل بحيث يمكن أن تعكس هذه السمات والأساليب معلومات الخطأ المقابلة للفئة.
استثناء
إذا قام برنامج Java برفع خطأ محدد عند تشغيله ، فسيقوم بإنشاء كائن من فئة الاستثناء المقابلة للخطأ. وتسمى هذه العملية استثناء رمي.
إنه في الواقع يرمي مثيلًا لكائن فئة الاستثناء المقابل.
اعتمادًا على فئة الاستثناء ، هناك طريقتان لرمي الاستثناءات: رمي النظام التلقائي ورمي المستخدم:
1. سوف يطرده النظام تلقائيًا
يتم إلقاء استثناءات خطأ التشغيل المحددة في النظام تلقائيًا بواسطة النظام.
2. رميات المستخدم
لا يمكن إلقاء الاستثناءات المعرفة من قبل المستخدم تلقائيًا بواسطة النظام ، ولكن يجب إلقاؤها من قبل المستخدم في عبارات Java. في عبارات Java ، يتم استخدام بيان الرمي لرمي "استثناء" بشكل صريح.
اسم طريقة إرجاع اسم طريقة (قائمة المعلمة) في تنسيق رميات قائمة أسماء فئات الاستثناءات المراد إلقاؤها {
...
رمي مثيل فئة الاستثناء ؛ // لاحظ هنا ...
}
يلاحظ:
1) بشكل عام ، يتم طرح استثناء عند استيفاء شرط معين في البرنامج ؛
في كثير من الأحيان ضع بيان الرمي في فرع IF IF ،
إذا (أنا> 100)
رمي (جديد myException ()) ؛
2) للطرق التي تحتوي على عبارات رمي ، يجب إضافة الأجزاء التالية إلى تعريف رأس الطريقة:
يلقي قائمة أسماء فئات الاستثناءات التي يجب إلقاؤها. هذا أساسًا لإبلاغ الطريقة العليا لاستدعاء هذه الطريقة ، والاستعداد لقبول الاستثناءات التي قد ترميها أثناء التشغيل. إذا كان هناك أكثر من عبارة رمي واحدة في هذه الطريقة ، فيجب سرد جميع الاستثناءات الممكنة في رميات رأس الطريقة.
3) تتطلب لغة Java أن يتم إعلان جميع الفئات التي تم إعلانها مع الكلمة الرئيسية الرميات ، ويجب أن تكون الكائنات التي تم إلقاؤها بالرمي فئة قابلة للارتناء أو فئة الفرعية. إذا حاولت رمي كائن غير قابل للرمي ، فسيقوم برنامج التحويل البرمجي Java بالإبلاغ عن استثناء خطأ:
فكر بشكل أساسي في كيفية التقاط الاستثناءات ، وكيفية القفز بعد التقاط الاستثناءات ، وكيفية كتابة عبارات معالجة الاستثناءات
1. حاول ... اصطياد ... أخيرًا حظر
1) حاول
يحتوي {} في عبارة TRY على جزء من رمز البرنامج الذي قد يرمي استثناءًا واحدًا أو أكثر. تحدد هذه الرموز في الواقع نطاق الاستثناءات التي يمكن اكتشافها بواسطة كتلة الصيد بعد ذلك.
في حالة حدوث استثناء عندما يصطدم برنامج Java ببيان في كتلة Try ، لم يعد يستمر في تنفيذ بيانات أخرى في كتلة Try ، ولكنه يدخل مباشرة كتلة الصيد للعثور على نوع الاستثناء المطابق الأول ومعالجته.
2) الصيد كتلة
تشبه معلمات بيان الصيد تعريف الطريقة ، بما في ذلك نوع الاستثناء وكائن استثناء.
يجب أن يكون نوع الاستثناء فئة فرعية لفئة الرمي ، والتي تحدد نوع الاستثناء الذي يتم التعامل معه بواسطة بيان الصيد ؛
كائن الاستثناء هو رمز الطريقة للتعامل مع كائن الاستثناء في الأقواس المجعد التي ألقاها نظام وقت تشغيل Java في كتلة رمز البرنامج المحددة في المحاولة.
يمكن أن يكون هناك عبارات صيد متعددة تتعامل مع أنواع مختلفة من الاستثناءات بشكل منفصل.
يكتشف نظام وقت تشغيل Java نوع الاستثناء الذي تتم معالجته بواسطة كل عبارة Catch من أعلى إلى أسفل ، حتى يجد عبارة Catch التي تتوافق معها.
هنا ، يعني المطابقة النوع أن نوع الاستثناء في الصيد هو بالضبط نفس نوع كائن الاستثناء الذي تم إنشاؤه أو الفئة الأصل لكائن الاستثناء. لذلك ، يجب أن يكون ترتيب الفرز لبيان الصيد من خاص إلى عام. (فكر في لماذا؟)
3) أخيرًا حظر
يمكن القول أن البيان الأخير هو آلية تنظيف مقدمة لأحداث معالجة الاستثناءات. يتم استخدامه بشكل عام لإغلاق الملفات أو إصدار موارد النظام الأخرى. قد يكون لبيان Try-Catch-Finally بيانًا مع جزء أخيرًا.
إذا لم يكن هناك جزء أخيرًا ، عندما يحدد رمز البرنامج من خلال محاولة استثناء ، فلن يتم تنفيذ رموز البرنامج الأخرى ؛
إذا كان هناك جزء أخيرًا ، بغض النظر عما إذا كان هناك استثناء في كتلة المحاولة أو ما إذا كان قد تم تنفيذ جزء الصيد ، فيجب تنفيذ بيان الجزء الأخير.
يمكن ملاحظة أن الجزء الأخير من البيان يوفر خروجًا موحدًا للتعامل مع الاستثناءات.
يمكن أن تنتج استثناءات متعددة استثناءات مختلفة متعددة ، وإذا كنت ترغب في اتخاذ طرق مختلفة للتعامل مع هذه الاستثناءات ، فأنت بحاجة إلى استخدام آلية معالجة استثناءات متعددة.
يتم تحقيق معالجة استثناء متعددة من خلال تحديد عدة كتل الصيد بعد حظر المحاولة. يتم استخدام كل كتلة الصيد لتلقي ومعالجة كائن استثناء محدد. من خلال معلمات كتلة الصيد ، يحدد ما إذا كان يجب أن يكون كائن الاستثناء استثناءً تم استلامه ومعالجته بواسطة كتلة الصيد هذه.
ما هي كتلة الصيد التي تم الحصول عليها؟ وفقًا لمطابقة معلمات الاستثناء لكائن الاستثناء وكتاب الصيد: عندما يفيون بأي من الشروط الثلاثة التالية ، تعتبر كائن الاستثناء والمعلمة مطابقة:
1) ينتمي كائن الاستثناء إلى نفس فئة الاستثناء مثل المعلمة.
2) كائن الاستثناء ينتمي إلى فئة فرعية لفئة استثناء المعلمة.
3) كائن الاستثناء ينفذ الواجهة المحددة بواسطة المعلمات.
إذا تم استلام كائن الاستثناء الذي تم إنشاؤه بواسطة كتلة المحاولة بواسطة كتلة الصيد الأولى ، فسيقفز تدفق البرنامج مباشرة إلى كتلة بيان الصيد هذه. بعد تنفيذ كتلة البيان ، سيتم الخروج من الطريقة الحالية. سيتم تجاهل البيانات التي لم يتم تنفيذها في كتلة المحاولة وتجاهل كتل الصيد الأخرى. إذا لم يتطابق كائن الاستثناء الذي تم إنشاؤه بواسطة كتلة Try مع كتلة الصيد الأولى ، فسيذهب النظام تلقائيًا إلى كتلة الصيد الثانية للمطابقة. إذا كان الثاني لا يزال غير متطابق ، فسوف يتحول إلى الثالث والرابع ... حتى يتم العثور على كتلة استثناء يمكن العثور عليها ، وسيتم إكمال العملية.
إذا تم استلام كائن الاستثناء الذي تم إنشاؤه بواسطة كتلة المحاولة بواسطة كتلة الصيد الأولى ، فسيقفز تدفق البرنامج مباشرة إلى كتلة بيان الصيد هذه. بعد تنفيذ كتلة البيان ، سيتم الخروج من الطريقة الحالية. سيتم تجاهل البيانات التي لم يتم تنفيذها في كتلة المحاولة وتجاهل كتل الصيد الأخرى. إذا لم يتطابق كائن الاستثناء الذي تم إنشاؤه بواسطة كتلة Try مع كتلة الصيد الأولى ، فسيذهب النظام تلقائيًا إلى كتلة الصيد الثانية للمطابقة. إذا كان الثاني لا يزال غير متطابق ، فسوف يتحول إلى الثالث والرابع ... حتى يتم العثور على كتلة استثناء يمكن العثور عليها ، وسيتم إكمال العملية.
إذا لم يثير تنفيذ جميع العبارات في كتلة المحاولة استثناء ، فسيتم تجاهل جميع كتل الصيد وعدم تنفيذها.
يلاحظ:
1) يجب أن تؤدي البيانات الواردة في كتلة الصيد عمليات مختلفة وفقًا للاستثناءات المختلفة ، لذلك عند التعامل مع استثناءات متعددة ، يجب عليك الانتباه إلى تصميم ترتيب ترتيب كل كتلة صيد بعناية. بشكل عام ، يجب وضع كتل الصيد التي تتعامل مع استثناءات أكثر تحديدًا وشائعة في المقدمة ، في حين يجب وضع كتل الصيد التي يمكن أن تتطابق مع استثناءات متعددة في الخلف.
/*جرب المستخدم لتشغيل معالجة استثناء الخطأ: المشكلة هي هذا. عندما تكون القيمة الأولية لراتب المستخدم الذي تم إدخاله أقل من 800 ، فهذا خطأ. بالطبع ، إذا تجاوز التغيير في الراتب 20 ٪ ، فمن الخطأ أيضًا*/ استيراد Java.awt.*؛ استيراد java.applet.*؛ استيراد java.awt.event.*؛ الطبقة العامة userexceptionapplet يمتد Applet Passions ActionListener {label progr1 = new label ("الرجاء إدخال اسم الموظف والقيمة الأولية للراتب:") ؛ Label Promper2 = تسمية جديدة ("الرجاء إدخال الراتب المراد تعديله") ؛ اسم Textfield ، Isal ، nsal ؛ سلسلة MSG ؛ موظف EMP زر OKBTN = زر جديد ("موافق") ؛ زر cancelBtn = زر جديد ("إلغاء") ؛ public void init () {name = new textfield (5) ؛ Isal = New Textfield (5) ؛ nsal = new textfield (5) ؛ إضافة (prompt1) ؛ إضافة (اسم) ؛ إضافة (isal) ؛ إضافة (proper2) ؛ إضافة (nsal) ؛ إضافة (OKBTN) ؛ OKBTN.AddActionListener (هذا) ؛ CancelBtn.AddActionListener (هذا) ؛ إضافة (cancelBtn) ؛ } public void paint (Graphics g) {g.drawString (msg ، 0،80) ؛ } public void createemp (string empname ، double sa) {try {emp = new amepery (empname ، sa) ؛ msg = سلسلة جديدة (emp.toString ()) ؛ } catch (infullsalaryException is) {msg = new string (ise.toString ()) ؛ }} public void changeempsal (تغييرات مزدوجة) {try {emp.setempsalary (تغييرات) ؛ msg = سلسلة جديدة (emp.toString ()) ؛ } catch (infullsalaryexception illsal) {msg = new string (illsal.toString ()) ؛ } catch (inchalledalaryChangeException illsalChange) {msg = new string (emp.toString ()+illsalchange.toString ()) ؛ }} public void actionperformed (ActionEvent e) {String Empname ؛ Empsal مزدوج ، التغييرات ؛ Object OBJ = E.GetSource () ؛ if (obj == okbtn) {empname = new string (name.getText ()) ؛ if (empname == null) {msg = new string ("الرجاء إدخال اسم الموظف وراتبه أولاً وإنشائه") ؛ } if (nsal.getText () == null) {empsal = double.valueof (isal.getText ()). doublevalue () ؛ Createemp (empname ، empsal) ؛ } آخر {changeal = double.valueof (nsal.getText ()). doublevalue () ؛ changeempsal (تغييرات) ؛ }} if (obj == cancelBtn) {naem.settext ("") ؛ isal.settext ("") ؛ nsal.settext ("") ؛ } repaint () ؛ }} فئة الموظف {string m_empname ؛ مزدوج m_empsalary ؛ الموظف (اسم السلسلة ، الأولي المزدوج) يلقي غير unshalalalaryexception {m_empname = name ؛ // معرفة ما إذا كان هناك أي مشكلة هنا ، فإن رمز المرجع هو m_empname = new string (name) ؛ if (initsalary <800) {throw (new alustalalaryexception (هذا ، initsalary)) ؛ // بيان رمي} m_empsalary = initsalary ؛ } السلسلة العامة getempname () {return m_empname ؛ } public double getempsalary () {return m_empsalary ؛ } sterpsalary المنطقي العام (إخباري مزدوج) يلقي غير شرعي ، غير شرعي ، includalaryChangeException {if (Newsal <800) رمي (جديد غير شرعي. آخر if (getempsalary () == 0.0) {m_empsalary = newsal ؛ العودة صحيح. } آخر إذا (math.abs (newsal-getempsalary ())/getempsalary ()> = 0.2) رمي (جديد غير شرعي changeException (هذا ، getempsalary newsal ())) ؛ آخر {m_empsalary = newsal ؛ العودة صحيح. }} السلسلة العامة toString () {String s ؛ s = "الاسم:"+m_empname+"الراتب:"+m_empsalary ؛ العودة s ؛ }} class infullsalarexception يمتد الاستثناء {الموظف الخاص m_concernedemp ؛ خاص مزدوج m_ilegalsalary ؛ غير شرعي alfictalaryexception (الموظف EMP ، مزدوج isal) {super ("الأجر أقل من الحد الأدنى للأجور") ؛ m_concernedemp = EMP ؛ m_ilegalsalary = isal ؛ } السلسلة العامة tostring () {String s ؛ s = "الأجور المقدمة للموظفين غير قانونية: الموظفين:"+m_concernedemp.getempname ()+"الراتب غير القانوني:"+m_ilelegalsalary+"أقل من الحد الأدنى للأجور بقيمة 800 يوان" ؛ العودة s ؛ }} class invalualalaryChangeException يمتد الاستثناء {الموظف الخاص m_concernedemp ؛ خاص m_ilegalsalarychange ؛ غير شرعي changeException (الموظف EMP ، مزدوج CSAL) {Super ("تغيير الراتب كبير جدًا") ؛ m_concernedemp = EMP ؛ m_ilegalaryChange = csal ؛ } السلسلة العامة tostring () {String s ؛ s = "تغيير الأجور المقدم للموظفين غير قانوني: الموظف:"+m_concernedemp.getempname ()+"تغيير غير قانوني في تغيير الأجور:"+m_ilegalsalarychange+"20 ٪ أعلى من الراتب الأصلي" ؛ العودة s ؛ }}