الاستثناء RuntimeException هناك مجموعة من الاستثناءات (أغراض ناتجة عن صفوف ترث Exception) هي الصفوف التي ترث الصف RuntimeException الذي هو ابن للصف Exception .
هذه الاستثناءات يسمح لك المترجم Compiler بتجاهلها وعدم اختيار الاختياران السابقان بحيث تتم عملية الترجمة .
هذه الاستثناءات تظهر (بمعنى يتم توليد غرض من صف يرث RuntimeException) بسبب أخطاء معينة في الكود البرمجي بحيث يكون نوع الصف الذي نتج عنه نوع الغرض الاستثناء ملائم لنوع الخطأ أوالمشكلة.
ومع ذلك يمكنك التقاطها Catch it وكتابة كود للتعامل معها وتصحيحها (استخدام الخياران السابقان)
(ان اردت ذلك !!!)

أمثلة لهذه الاستثناءات (بملاحظة اني لم اذكرها كلها على الرسم ) :
صف الاستثناء : نوع المشكلة أو الحالة الاستثنائية التي يمثلها
ArithmeticException : الحالات الحسابية الغير مسموحة مثل محاولة القسمة على صفر .
ClassCastException : محاولة اجراء تحويل قسري على غرض من صف ما a مثلا ...الى صف جديد ليس نفس الصف a ولا احد ابنائه ولا احد ابائه .
ArrayStoreException : محاولة تخزين غرض من نمط ما في مصفوفة بحيث نمطه لا يناسب النمط المعرفة به المصفوفه .
NullPointerException : استعمال متحول غرض قيمته = null ( لم تجرى له عملية new ) لتمريره كوسيط ل method ما أو لباني ما أو اسناده ل data member .
IllegalArgumentException : تمرير برامتر الى method لا يتلائم نمطه مع نمط البارامتر الممرر.
لنعود الى الاختيار الأول : التعامل مع الاستثناء في مكان حدوثة (التقاطه ومعالجته مباشرة حال حدوثه)
كود
try{
هنا كود قد يعطي استثناء أو أكثر (ممكن من انواع صفوف مختلفة )
إذا لم يعطي هذا الكود أي استثناء وتنفذ كله بنجاح نتجاهل كتلة Catch وننتقل لتنفيذ ما في كتلة finally
Statment1;
Statment2;
Statment3;
Statment4;
}
كود
catch(IOException e){
كود يعالج الاستثناء الذى جرى الكشف عنه في كتلة try
يعالج الاستثناء من النوع المحدد بين القوسين حصرا (هنا IOException ) أو أحد آبائه
حيث يجرى هنا اتخاذ الاجراءات الازمة في حالة حدوث المشكلة ومن ثم الانتقال لكتلة finally
اذا لم يكن الاستثاء المقذوف في كتلة try من النوع IOException سيتم الانتقال لكتلة catch التالية .
فإن لم يكن هناك catch تالية .. اما ان يكون الصف أو الmethod تقذف استثناء بالكلمة throws
(فائدة استخدام الخياران معا)
وان لم تكن تستخدم الخيار الثاني ... اما ان يكون الاستثناء من نوع ابن ل RuntimeException ويتجاهله المترجم .
واما لا يكون ابن له وتحصل على اخطاء في زمن الترجمة ولن تتم ترجمة برنامجك .
}
كود
catch(Exception e){}
قد يكون الاستثناء الذي جرى قذفه ليس من النوع الذي حددته بين قوسين catch وقد يكون هناك أكثر من استثناء من أكثر من نوع والعمل ؟؟!!
ممكن أن نضع أكتر من كتلة catch متتالية بشرط ترتيبها الأبناء أولا ثم الأباء ... الصغير فالأكبر فالأكبر
(حسب شجرة الوراثة والا ستحصل على اخطاء في زمن الترجمة ولن تتم ترجمة برنامجك ).
انتهاء بكتلة catch (Exception e){} حيث Exception الصف الأب الأكبر لكل الاستثناءات .
التي ستقبل أي نوع من الاستثناءات في حال لم تستطيع ان تحزر كل الأنواع المناسبة للاستثناءات التي قد تحدث .
كود
finally{الكود الذي يلي تلك الأحداث كلها}
ملاحظة هامة :
بفرض ان تنفيذ Statment2; سينج عنه قذف استثناء .
فإن ما يحصل هو تنفيذ Statment1; بنجاح ثم الانتقال الى فحص كتل catch بحثا عن الاستثناء الملائم ومن ثم الانتقال الى كتلة finally وهذا يعني ان كلا من
Statment3;
Statment4;
لن يجري تنفيذهما ويجب الانتباه الى هذه النقطة كي لا يتم فقد أجزاء مهمة من البرنامج .
ملاحظة : كتلة finally اختيارية وممكن عدم وضعها .
ملاحظة : اذا لم يقذف الكود ضمن try أي استثناء يجري تنفيذ كامل الكود ضمن try وتجاهل كل كتل catch والانتقال لتنفيذ كتلة finally ان وجدت .
متى نختار الاختيار الثاني :
قد نتهرب من معالجة الاستثناء مباشرة في مكانه لعدم معرفتنا بنوعه .
قد نشك اننا لم نضع الأنماط المناسبة في كتل catch ( لم نستعمل catch(Exception e)لمراعاة الدقة ) مما يؤدي الى انه لم تتم معالجة الاستثناء (لم تلتقطه أي من كتل catch) مما يؤدي الى اخطاء في زمن الترجمة .
--------------------
سيمضي ركبنا العملاق لن يركع .. بايمان لغير الحق لا يصدع
عزيزا شامخا كالمجد بل اروع .. فسجل ايها التاريخ ما تسمع :
فلسطين لنا الامال والمطمع .. نعاهد ان نحررها وأن ترجع
ونقسم نستعيد الارض أو نصرع .. ويبقى رمزنا الزيتون والمدفع