تتضمن الاستثناءات في Java مسألة فئة الوالدين والطفل ، والتي يمكن تلخيصها في جملة واحدة: يجب أن يحتوي الاستثناء الذي ألقاه مُنشئ الفئة الفرعية على استثناءات من الفئة الأصل. يمكن أن تختار طريقة الفئة الفرعية إلقاء استثناء من الفئة الأصل "نطاق أقل من أو يساوي" أو عدم إلقاء استثناء.
1. لماذا يتعين على المنشئ إلقاء استثناء يحتوي على فئة الأصل؟
هناك مقطع في "شيء ما في جافا":
استثناء قيود: عند الكتابة فوق طريقة ، يمكن فقط إلقاء تلك الاستثناءات المدرجة في وصف الاستثناء لطريقة الفئة الأساسية.
لا تعمل قيود الاستثناءات لصالح المنشئ ، ستجد أن مُنشئ Stormyinning يمكنه إلقاء أي استثناءات دون الاهتمام بالاستثناءات التي ألقاها مُنشئ الفئة الأساسية. ومع ذلك ، نظرًا لأنه يجب استدعاء المُنشئ بطريقة أو بأخرى ، يجب أن يحتوي وصف الاستثناء لمؤسس الفئة الفرعية على وصف استثناء لمؤسسة الفئة الأساسية
هذا المقطع مربك بعض الشيء في البداية ، لكنك ستفهم بعد قراءته:
بادئ ذي بدء ، فإن وصف الاستثناء هو فقط لأسلوب التجاوز ، ومن الواضح أن المُنشئ ليس ضمن هذا النطاق ، بحيث يمكن لمؤسس الفئة الفرعية أن يرمي أي استثناء دون مراعاة الاستثناء الذي ألقاه المنشئ الأصل. ومع ذلك ، عندما يكون كائن فئة فرعية جديد ، سيتم استدعاء مُنشئ الفئة الأصل بالتأكيد ، لذلك يجب أن يؤخذ الاستثناء الذي ألقاه مُنشئ فئة الوالدين المقابلة التي يدعوها مُنشئ الفئة الفرعية. في هذا الوقت ، لأن "مُنشئ الفئة الفرعية لا يمكنه التقاط الاستثناء الذي ألقاه مُنشئ الفئة الأصل (والذي سيتم ذكره لاحقًا) ،" يجب على مُنشئ الفئة الفرعية أن يرمي هذا الاستثناء.
يمتد الفئة someException استثناء {} class theotherexception يمتد الاستثناء {} class basec {public basec () يلقي بعض الشيء {} public basec (int a) يلقي theotherexception {}} الفئة subc يمتد basec {subc public). // Super (37) يجب إلقاؤه ؛ // إذا استبدلت Super () بهذا ، فيجب إلقاء theotherexception}}2. لماذا لا يستطيع مُنشئ الفئة الفرعية التقاط الاستثناء الذي ألقاه مُنشئ الفئة الأصل؟
لأنه إذا أرادت الفئة الفرعية التقاط الاستثناء الذي ألقاه الفئة الأصل ، فيجب عليه عرض المكالمة Super () ؛ أو سوبر (xxx ...) ؛ ومع ذلك ، فإن Super () و This () لها ميزة ، وهي أنه يجب وضعها في السطر الأول ، والتي تتناقض
3. عندما يكون للفئة الأم والواجهة الموروثة بالفئة الفرعية اسم الطريقة نفسها ، يجب أن تتبع طريقة المعالجة حد الاستثناء.
الفئة someException يمتد الاستثناء {} class theotherexception يمتد الاستثناء {} واجهة interf {public void function () theotherexception ؛ } class basec {public void function () يلقي SomeException {}} subc يمتد BASEC interf {// في هذا الوقت ، يمكنك فقط اختيار عدم إلقاء استثناء وظيفة الفراغ العام () {} // خطأ: استثناء لا يتوافق بعضها مع جملة throws في interf.function () // public void function () // خطأ: الاستثناء غير متوافق مع جملة THROWS في basec.function () // public void function () reltherexception {} ؛ }4. لماذا ترمي الفئات الفرعية فقط تلك الاستثناءات المدرجة في وصف الاستثناء لطريقة الفئة الأساسية؟
نظرًا لأن الفئة الفرعية لديها إمكانية تحويل تصاعدي إلى فئة الأصل ، إذا تم السماح للفئة الفرعية برمي الاستثناءات حسب الرغبة ، ثم عندما يتم تحويل الفئة الفرعية إلى فئة الأصل ، فإن واجهة الطريقة (دعنا نسميها هذه هي الحالة) ستصبح نوع الطريقة للفئة الأصل. في هذا الوقت ، تكمن المشكلة في أن الفئة الفرعية ستلقي استثناءات ، لكن لا يمكن لفئة الوالدين التعامل مع الاستثناء. لذلك ، من أجل ضمان النوع القابل للاستبدال للكائن ، من الضروري أن "يتم طرح فقط تلك الاستثناءات المدرجة في وصف الاستثناء لطريقة الفئة الأساسية."
تتضمن "الاستثناءات" المذكورة هنا أيضًا استثناءات هذه الاستثناءات!
5. لا أعرف ما إذا كان هذا مهمًا. ربما أنا غبي نسبيا. فكرت في الأمر لفترة طويلة قبل أن أفهم ذلك. دعنا نكتبها في الوقت الحالي.
يمتد الفئة someException استثناء {} class basec {public void function () يلقي بعض الشيء {} // إذا كان الاستثناء الذي تم إلقاؤه هنا هو فئة فرعية استثناء وقت التشغيل ، فلا يمكن معالجتها استثناءً من الفئة subc. معالجة الاستثناء! /* public void function () يلقي SomeException {super.function () ؛ } */ public void function () {try {super.function () ؛ } catch (someException e) {e.printStackTrace () ؛ }}}التفسير التفصيلي أعلاه للاستثناءات التي تنطوي على فصول الأب والطفل على أساس جافا هو كل المحتوى الذي أشاركه معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.