تعلم الجافا - جمل معالجة الاستثناءات Exceptions Handling Statement
ما معنى بالاستثناءات ؟
من الثابت بقواعد الرياضيات انه لا يجوز القسمة على صفر بأي حال من الأحوال لذلك لم يتمكن البرنامج من تنفيذ العملية المطلوبة وستظهر للمستخدم رسالة خطا تنفيذي لا يمكنه تفاديها ولعل الأغلب أنها ستسبب بإغلاق البرنامج.
ولمعالجة أخطاء التنفيذ هذه وتحجيمها فبل حدوثها وفرت لنا لغات البرمجة وعلى رأسها الجافا آلية تتمثل بوضع جمل استثناءات خاصة يتوقع من خلالها المبرمج أنواع أخطاء التنفيذ التي قد تحدث ويقوم ببرمجة حدث برمجي بكل استثناء ليتم تنفيذه بدلا من خطا التنفيذي الخالصة إن الاستثناءات هي عبارة عن آلية برمجية لمعالج أخطاء التنفيذ المحتمل وقعها وهذا ما يقصد بمعالجة الاستثناءات فى لغة الجافا.
معالجة الاستثناءات في لغة جافا
من السهل على المبرمج أن يكون قادرًا على التعامل مع الأخطاء الهيكلية والنحوية للبرنامج ، لكن المشكلة هي أن البرنامج الناتج لن يعمل بشكل مستقل هناك العديد من العوامل التي تؤثر على طريقة تنفيذ البرنامج ، منها المستخدم الذي من المفترض أن يغذي البرنامج بالبيانات المطلوبة ، وكذلك الأم أما بالنسبة لبيئة عمل البرنامج ونظام التشغيل فقد ركز على الجهاز وتوافر ملفات وملحقات إضافية مرتبطة بالبرنامج وعوامل أخرى قد تتسبب أيضًا في حدوث أخطاء في وقت التشغيل Run Time Error
على سبيل المثال : لنفترض أننا عملنا على برمجة آلة حاسبة بسيطة التثبيت ، وعند تجربتها ، قسّم المستخدم رقمًا على صفر.ثبت بقواعد الرياضيات أنه لا يجوز القسمة على صفر بأي شكل من الأشكال ، لذلك لم يتمكن البرنامج من إجراء العملية المطلوبة ، وسيرى المستخدم رسالة خطأ لا يمكنه تجنبها ، وربما من المحتمل تسبب في إغلاق البرنامج
ومن أجل معالجة أخطاء التنفيذ هذه وقياسها قبل حدوثها ، زودتنا لغات البرمجة ، وخاصة Java ، بآلية تتمثل في وضع بنود استثناء خاصة يتوقع من خلالها المبرمج أنواع أخطاء التنفيذ التي قد تحدث ثم يبرمج أحد البرامج. يتم تنفيذ الحدث مع كل استثناء بدلاً من الخطأ التنفيذي البحت الاستثناءات هي معالج آلية البرمجة لأخطاء التنفيذ المحتملة.
أقسام جمل معالجة الاستثناءات
قسم try
هو عبارة عن كتلة خاصة من التعليمات البرمجية يكتب فيها المبرمج كودًا يتوقع خلاله حدوث خطأ في التنفيذ ، ويكون تركيبه العام كما يلي:try{java code statements;}
القسم catch
يختص هذا القسم باحتواء التعليمات البرمجية التي من شانها معالجة الأخطاء التي قد تحدث داخل القسم try وبما ان أخطاء التنفيذ كثيرة متعددة فيمكننا صياغة أكثر من تعليمة catch لتحتوي كل واحدة منها على نوع معين من أخطاء التنفيذ وتكن عادة جميع جمل catch مرتبطة بجملة try تكتب جمل catch وفق الصيغة العامة التالية :catch (ExceptionType name){java code statments;}
ويعتبر القسم catch إجباري فلا يمكننا استخدام معالجة الاستثناءات بدونه ولكن يمكننا إدراجه بصورته العامة دون صياغة أي تعليمة برمجية بداخله وهنا بمجرد حدوث الخطأ التنفيذي المحدد داخل جملة catch الفارغة فان البرنامج سيتجاهل تنفيذ التعليمة البرمجية التي تحتوي الخطأ والمدرجة داخل القسم try ليتنقل مباشرة إلى تنفيذ التعليمات التي تلي معالجة الاستثناء كما سنبين ذلك في الأمثلة القادمة.
القسم finally
تعرف على الصيغة العامة للقسم finally تكون على النحو التالي :
الصيغة الكاملة لكتلة معالجة الاستثناء
الشكل التالي يبين الأقسام الثلاث لكتلة معالجة الاستثناء :try{java code statments;}catch (ExceptionType1 name){Exception 1;}catch (ExceptionType2 name){Exception 2;}finally{java code statements;}
آلية تنفيذ كتلة الاستثناءات
لمعرفة طريقة تنفيذ الكتل الاستثنائية, ادرس البرنامج التالي :public class MyMain2{public static void main(Stringargs[]){system.Out.Println("Arabic SEO");int X=10;float b=X/0;System.Out.Println("The answer is"+b);}//end main}//end class
لاحظ ان البرنامج قام بتنفيذ تعليمة الطباعة Arabic SEO وبمجرد انتقال تدفق البرنامج إلى تعليمة القسمةfloat b= X/0 وجد معالج أخطاء التنفيذ أن عملية القسمة غير الشرعية فلا يجوز القسمة على صفر ولهذا السبب اظهر لنا رسالة خطا التنفيذ وبصورة متزامنة أوقف تنفيذ البرنامج ومنع تعليمة الطباعة الثانية من التنفيذ لنعمل الآن على إعادة صياغة البرنامج باستخدام القسم try من معالجة الاستثناءات, كما في الشكل التالي:
public class MyMain2{public static void main(String args[]){System.Out.Println("Arabic SEO");try{int X=10;float b=X/0;System.Out.Println("The answer is"+b);}//end try}//end main}//end class
public class MyMain2{public static void main(String args[]){System.Out.Println("Arabic SEO");try{int X=10;float b=X/0;System.Out.Println("The answer is"+b);}//end trycatch(Exception e){System.Out.Println("Not Allow to Dived by 0");}//end catchfinally{System.Out.Println("Sorry");}//end finally}//end main}//end class