أي برنامج سيعمل ثابت فقط فيفي حالة تصحيح رمز المصدر الخاص به ، ولا توجد أي شروط فيه يمكن أن تسبب حالات غير متوقعة. يتم تنفيذ عملية اصطياد الفشل المحتمل في مرحلة البرمجة. للقيام بذلك ، يأخذ المطور في الاعتبار جميع النتائج المتوقعة ويحاول الحد من تأثير الخطأ بحيث لا يمكن تعطيل البرنامج أو يؤدي إلى انهياره.
عندما قد يكون من الضروري معالجة استثناء
في جافا ، يمكن أن يكون سبب الاستثناءات من قبلإدخال بيانات غير صحيح من قبل المستخدم ، وعدم وجود مورد ضروري للبرنامج أو انقطاع مفاجئ للشبكة. للاستخدام المريح للتطبيق الذي أنشأه المطور ، من الضروري التحكم في مظهر الحالات غير الطبيعية. يجب على المستهلك عدم الانتظار لإنجاز برنامج معلق ، أو فقدان البيانات كنتيجة لاستثناءات غير معالَجة ، أو ببساطة ظهور رسائل تفيد بأن هناك خطأ ما.
التعامل مع استثناء جافا
Что необходимо учитывать?لغة Java لها وظيفة معالجة الاستثناء المضمنة الخاصة بها. بالطبع ، يتم اكتشاف نسبة كبيرة من الأخطاء في مرحلة التجميع ، عندما يقوم النظام تلقائيًا بالإبلاغ عن أنه من المستحيل استخدامه بعد ذلك. ولكن هناك نوع من الاستثناءات التي تحدث أثناء البرنامج. يجب أن يكون المطور قادرًا على توقع ذلك وتصميم الشفرة بحيث لا يتسبب في حدوث خطأ ، بل يعالجها بطريقة خاصة أو ينقل التحكم إلى فرع آخر.
في Java ، يتم فرض مثل هذا الاستثناء من قبل المحول البرمجي ، لذلك فإن المشاكل النموذجية معروفة ولها مخطط التنفيذ القياسي الخاص بها.
استثناءات نموذجية
أبسط مثال حيث تستطيعالحصول على استثناء هو التقسيم. على الرغم من بساطته ، في التعبير ، كمقطع ، قد يكون صفراً ، مما يؤدي إلى خطأ. حسنا ، إذا كان يمكن التنبؤ بمظهره في وقت سابق ومنعه. لكن هذا الخيار غير متوفر دائمًا ، لذا يجب تنظيم الاستثناء على الفور في حالة "القسمة على صفر".
في Java ، تبدو آلية معالجة الأخطاء كما يلي:
- يتم إنشاء كائن استثناء على كومة الذاكرة المؤقتة ، تماماً مثل أي كائن آخر؛
- توقف المسار الطبيعي للبرنامج.
- تحاول آلية الاستثناء البحث عن طريقة بديلة لمتابعة التعليمات البرمجية؛
- بعد العثور على مكان التنفيذ الآمن للبرنامج في المعالج ، سيتم استعادة العمل ، أو سيتم طرح استثناء بطريقة خاصة.
أبسط مثال على إنشاء خطأ قد يبدو كالتالي:
إذا (a == فارغة)
رمي جديد NullPointerException () ؛
هنا ، يتم فحص المتغير a للتهيئة ،أي هل الإشارة إلى كائن null غير متساوية؟ في حالة ظهور مثل هذا الموقف ، وهناك حاجة إلى معاملة خاصة ، يتم طرح استثناء باستخدام رمي جديد NullPointerException ().
بعض التفاصيل حول الكلمات الرئيسية
عند التعامل مع الاستثناءات ، غالبًا ما يكون من الضروري استخدام الكلمات الأساسية Java للإشارة إلى إجراء ما. هناك خمسة منهم بلغة البرمجة هذه:
- محاولة. لقد تمت مصادفة هذه الكلمة الرئيسية بالفعل ، وهو ما يعني الانتقال إلى مقطع من التعليمة البرمجية يمكنه إنشاء استثناء. يقتصر الحظر على الأقواس المتعرجة {}.
- الصيد. يقوم باعتراض نوع الاستثناء اللازم ويقوم بمعالجته وفقًا لذلك.
- Finally.هذه الكلمة الأساسية اختيارية وتعمل لتنفيذ جزء معين من التعليمات البرمجية الضرورية في أي حال ، حتى إذا لم يتم اكتشاف أي استثناء. يضاف مباشرة بعد كتلة المحاولة.
- رمي - يسمح لك بإنشاء استثناءات جافا في أي مكان في التعليمات البرمجية.
- Throws هي كلمة رئيسية يتم وضعهاتوقيع الطريقة هذا يعني أن التعليمة البرمجية التالية قد تؤدي إلى استثناء Java من النوع المحدد. مثل هذه العلامة بمثابة إشارة للمطورين أن تضع في الاعتبار - قد لا تعمل الطريقة كما هو متوقع.
قبض على المحاولة
رمي استثناءات جافا بشكل طبيعييشير إلى أنه سيتم معالجتها خصيصا. من الأنسب القيام بذلك إذا كان قسم الكود مسورًا في كتلة معينة. والتي ربما تحتوي على استثناء. عند تنفيذ هذا الرمز ، سيجد الجهاز الظاهري موقفًا غير متوقع ، وفهم أنه في كتلة حرجة والتحكم في النقل إلى قسم المعالجة.
في Java ، يتم لف الكود في كتلة تجربة خاصة ،في الداخل الذي يمكن طرح استثناء. وبالتالي ، يتم وضع العديد من المواقف غير المتوقعة فيه في آن واحد ، والتي سيتم اكتشافها في مكان واحد دون الانتشار فوق الشفرة.
رمز الأكثر نموذجية مع وحدة المعالجة يشبه هذا:
جرب
سيتم تعريف // الرمز هنا الذي يمكن أن يلقي استثناء
} catch (استثناء_النمط_1 identifier_1) {
// هنا تتم معالجة الاستثناء وفقًا لنوعه وشروطه ؛
} catch (Exception_Type2 ID_2) {
// هنا تتم معالجة الاستثناء وفقًا لنوعه وشروطه ؛
}
تشير كلمة catch إلى أن الرمزمحددًا للاستثناء ، يجب معالجته كما هو موضح أدناه ، بشرط أن يطابق نوعه. يمكن استخدام المعرف داخل كتلة كود المعالجة كوسيطات.
أخيرا
كما أصبح واضحا من الفصل السابق ، الكتلاللحاق استثناءات الصيد ومعالجتها. ولكن غالبًا ما ينشأ موقف عندما يجب تنفيذ بعض التعليمات البرمجية بغض النظر عما إذا كانت الأخطاء قد تم اكتشافها أم لا. هناك أخيرا كلمة أساسية لهذا. يتم استخدامه لزيادة قيم العدادات المختلفة أو إغلاق الملفات أو الاتصال بالشبكة.
هذا القسم يحتوي على عدة كتلاللحاق بالأساليب التي اخترعها لالتقاط استثناءات. على سبيل المثال ، يؤدي الكود الموجود في المحاولة إلى حدوث موقف غير متوقع مثل Cold. ثم تعبيرات "اشتعلت البرد!" و "هل هذا شيء ليهتف؟" سيتم عرض على وحدة التحكم. وهذا هو ، وأخيرا يتم تنفيذ كتلة على أي حال.
في الواقع ، هناك طريقة لتجنب تشغيل في النهاية. يرتبط بإغلاق الجهاز الظاهري. يمكنك العثور على كيفية تنفيذ ذلك على الإنترنت.
رمي الكلمة
رمي يلقي استثناء. يشبه بناء الجملة هذا:
رمي NewException () ؛
هذا يخلق استثناء جديد مع نوعNewException (). كنوع ، يمكن استخدام الفئات المضمّنة بالفعل في مكتبات Java القياسية والمعرّفة مسبقًا من قبل مطور إنتاجها.
يتم تضمين مثل هذا البناء في وصف الطريقة ، والتي يجب بعد ذلك استدعاءها في إطار كتلة المحاولة حتى تتمكن من اعتراضها.
يلقي الكلمة الرئيسية
ماذا تفعل إذا أثناء عملية التطويرموقف حيث يمكن لطريقة ما أن ترمي استثناءً ولكنها غير قادرة على معالجته بشكل صحيح. لهذا ، تتم الإشارة إلى كلمة throws ونوع الاستثناء المحتمل في توقيع الطريقة.
هذا التصنيف هو نوع من المؤشر إلىالمطورين العميلين أن الأسلوب غير قادر على معالجة الاستثناء الخاص به. بالإضافة إلى ذلك ، إذا كان نوع الخطأ قابلاً للتحقق ، فسوف يجبره المترجم على الإشارة إلى ذلك بوضوح.
جرب مع الموارد
في الإصدار 7 من Java ، قام المطورون بتضمين مثل هذا الابتكار المهم مثل معالجة كتلة تجربة باستخدام الموارد.
Многие создаваемые объекты в Java, после их يجب إغلاق الاستخدام لتوفير الموارد. في السابق ، كان عليّ أخذ هذا في الاعتبار وإيقاف مثل هذه الحالات يدويًا. الآن لديهم واجهة AutoClosable. يساعد على إغلاق الكائنات المستخدمة بالفعل الموجودة في كتلة المحاولة. بفضل هذا النهج ، أصبحت شفرة الكتابة أكثر ملاءمة ، وزادت قابليتها للقراءة بشكل كبير.
دروس استبعاد Java الأصلية
Создатели описываемого языка программирования أخذت في الاعتبار العديد من الجوانب عند تصميم أنواع الطوارئ. ومع ذلك ، من المستحيل منع جميع المتغيرات الناتجة عن الأحداث ، وبالتالي ، فإن Java لديها القدرة على تحديد استثناءاتها الخاصة التي تناسب احتياجات كود معين على وجه التحديد.
أسهل طريقة لإنشاء هي وراثة الكائن الأكثر ملاءمة للسياق.
هذا هو المكان الذي حدث فيه الميراث من الاستثناء ،الفئة المستخدمة لتحديد الاستثناءات الخاصة بك. هناك نوعان من الإنشاءات في MyException - أحدهما افتراضيًا ، والثاني بحجة msg من النوع String.
Затем в public классе FullConstructors реализован الأسلوب f الذي يحتوي على توقيع يلقي MyException. تعني هذه الكلمة الأساسية أن f قد يلقي استثناء Java من النوع MyException. علاوة على ذلك ، في نص الأسلوب ، يتم إخراج المعلومات النصية إلى وحدة التحكم ويتم طرح جيل MyException الفعلي عن طريق رمي.
الطريقة الثانية مختلفة قليلاً عن الأولى ،أنه عند طرح استثناء ، يتم تمرير معلمة سلسلة إليه ، والتي ستنعكس في وحدة التحكم عند الالتقاط. يمكنك أن ترى بشكل رئيسي أنه يتم وضع f () و g () في كتلة try ، وأن الكلمة الأساسية catch تم تعيينها على MyException. ستكون نتيجة المعالجة هي إخراج رسالة خطأ إلى وحدة التحكم:
وبالتالي اتضح لإضافة استثناءات جافا التي تم إنشاؤها باليد.
هندسة الاستثناء
مثل كل الكائنات في Java ، هناك استثناءات أيضًاورثت ولها هيكل هرمي. العنصر الجذر لجميع الأخطاء التي ألقيت في لغة البرمجة هذه هو فئة java.lang.Throwable. يتم توريث نوعين منه - الخطأ والاستثناء.
خطأ - يخطر الأخطاء الحادة وهذه هي استثناءات جافا لم يتم التحقق منه. يحدث اعتراض هذه البيانات ومعالجتها في معظم الحالات في مرحلة التطوير ولا يلزم تنفيذها في رمز التطبيق النهائي.
Наиболее часто используемым классом для создания ويخدم تحليل الاستثناء استثناء. والتي بدورها تنقسم إلى عدة فروع ، بما في ذلك RuntimeException. يتضمن RuntimeException استثناءات وقت التشغيل ، أي تحدث أثناء تشغيل البرنامج. جميع الفصول الموروثة منه غير محددة.
استثناءات شائعة
في Java ، يتم استخدام الاستثناءات ، التي ترد القائمة أدناه ، في أغلب الأحيان ، لذلك يجدر وصف كل منها بمزيد من التفصيل:
- ArithmeticException. يتضمن ذلك الأخطاء المتعلقة بالعمليات الحسابية. المثال الأكثر لفتا هو القسمة على صفر.
- ArrayIndexOutOfBoundsException - الوصول إلى عدد عنصر الصفيف الذي يتجاوز طوله الإجمالي.
- ArrayStoreException - محاولة لتعيين عنصر صفيف من نوع غير متوافق.
- ClassCastException - محاولة لتلقي نوع واحد إلى آخر بشكل غير صحيح.
- IllegalArgumentException - باستخدام وسيطة غير صالحة في استدعاء الأسلوب.
- NegativeArraySizeException - استثناء عند إنشاء صفيف بالحجم السلبي.
- NullPointerException - إساءة استخدام مرجع فارغ.
- NumberFormatException - يحدث عندما يتم تحويل سلسلة إلى رقم بشكل غير صحيح.
- UnsupportedOperationException - العملية غير مدعومة.
هذه الأمثلة هي أنواع استثناء Java غير محددة. وهنا ما تبدو عليه الأشياء القابلة للتحقق:
- ClassNotFoundException - لم يتم الكشف عن الفئة.
- IllegalAcccessException - تقييد وصول الفئة.
- InterruptedException - مقاطعة مؤشر الترابط.
- NoSuchFieldException - الحقل المطلوب غير موجود.
تفسير الاستثناءات
Говоря о часто встречаемых исключениях нужно لاحظ أن تفسيرهم أثناء التطوير قد يساء فهمهم. فيما يلي قائمة قصيرة تشرح بمزيد من التفصيل متى قد ينشأ موقف غير متوقع.
NullPointerException.الحالة الأولى عند حدوث استثناء هي مرجع لمرجع كائن فارغ. ينطبق هذا أيضًا على أساليب مثيل فارغ من فئة. يمكن أيضًا طرح nullPointerException إذا كانت الصفيف خالية. يساعد الفحص الدوري للكائنات الخالية على تجنب مثل هذه الحالات.
ArrayIndexOutOfBoundsException.لا يمكن أن يوجد أي برنامج دون استخدام المصفوفات. وفقًا لذلك ، يمكن أن يؤدي الوصول المتكرر إليهم إلى حدوث أخطاء. يحدث استثناء عندما يحاول مطور الوصول إلى عنصر صفيف غير موجود في قائمة الفهرس. على سبيل المثال ، القيمة المطلوبة أكبر من الطول أو أقل من الصفر. يظهر غالبًا نتيجة لحقيقة أن العدد في الصفيف يبدأ من الصفر.
النتائج
تعتبر معالجة استثناء Java أداة قويةبيئة ، مما يسهل عمل المبرمج بشكل كبير ويسمح له بإنشاء كود نظيف وخالي من الأخطاء. تعتمد حالة وسمعة شركة التطوير على مدى سلاسة وثبات وظائف التطبيق.
بالطبع ، في برامج أكثر أو أقل بساطةتتبع المواقف الشاذة أسهل بكثير. لكن في المجمعات الآلية الكبيرة التي تضم عدة مئات الآلاف من الخطوط ، لا يكون ذلك ممكنًا إلا نتيجة لتصحيح الأخطاء والاختبار المطول.
بالنسبة إلى استثناءات Java التي تحدث عنها أخطاءفي بعض التطبيقات ، تقدم الشركات الفردية مكافآت عندما يجدها المتحمسون. بشكل خاص ، يتم تقدير تلك التي تسبب انتهاكًا لسياسة أمان حزمة البرامج.