يقوم Java Virtual Machine (المشار إليه فيما بعد بـ JVM) بمعالجة التعليمات البرمجية وتشغيل الطرق واحدة تلو الأخرى، بدءًا من الطريقة
main
. عندما تصل إلى الطريقة التالية، تقول أن هذه الطريقة موجودة في الجزء العلوي من المكدس. بعد تنفيذ الطريقة بالكامل، تتم إزالتها من المكدس واستبدالها بالطريقة التالية في قائمة الانتظار. لتوضيح المبدأ، اكتب هذا الكود:
package errorhandling;
public class errorChecking {
public static void main(String[] args) {
System.out.println("Метод Main успешно запущен");
m1();
System.out.println("Метод Main заканчивает свою работу");
}
static void m1() {
System.out.println("Первый метод передаёт привет!(m1)");
m2();
}
static void m2() {
System.out.println("Второй метод передаёт привет(m2)");
}
}
لدينا ثلاث طرق: الطريقة main
والطريقة m1
والطريقة m2
. عند بدء تشغيل البرنامج، توجد الطريقة في الجزء العلوي من المكدس main
. داخل الطريقة main
، تسمى الطريقة m1
. عند استدعائه، يقفز إلى أعلى المكدس. الأسلوب m1
بدوره يستدعي m2
. تنتقل الطريقة الآن m2
إلى أعلى المكدس، وتزيل m1
. تخيل هذا للحظة - main
في الأعلى m1
وفي الأعلى m2
! وبعد أن تنتهي أعمالها، m2
تنتهي وتعود السيطرة إليها m1
. تتم أيضًا إزالة الطريقة m1
، عند اكتمالها، من المكدس، ويتم التحكم مرة أخرى في الطريقة main
. قم بتشغيل برنامجك وانظر إلى نافذة الإخراج: الطريقة الرئيسية تعمل بنجاح الطريقة الأولى تقول مرحبًا!(m1) الطريقة الثانية تقول مرحبًا(m2) تخرج الطريقة الرئيسية إذا حدث خطأ ما في الطريقة m2
، فإن JVM (Java Virtual Machine )، تتذكر، أليس كذلك؟) سيبحث عن معالجات الأخطاء، على سبيل المثال كتلة try … catch
. إذا لم تكن هناك أخطاء في m1
طريقة معالج الأخطاء، فسيتم تمرير الاستثناء إلى الطريقة m1
، على أمل أن تتمكن من معالجتها. إذا لم يكتشف معالج الأخطاء هنا، فسينتقل الاستثناء مرة أخرى إلى أعلى المكدس، هذه المرة إلى الطريقة main
. إذا لم تكتشف الطريقة main
الاستثناء، فستتلقى رسالة خطأ غريبة مطبوعة في نافذة الإخراج. على سبيل المثال، اجعل طريقتك m2
تبدو كما يلي:
static void m2() {
int x = 10;
int y = 0;
double z = x / y;
System.out.println( z );
System.out.println("Method Two - m2");
}
تحتوي هذه الطريقة على خطأ القسمة على صفر. إليك النسخة الكاملة من البرنامج، تحقق منها:
package errorhandling;
public class errorChecking {
public static void main(String[] args) {
System.out.println("Метод Main успешно запущен");
m1();
System.out.println("Метод Main заканчивает свою работу");
}
static void m1() {
System.out.println("Первый метод передаёт привет!(m1)");
m2();
}
static void m2() {
int x = 10;
int y = 0;
double z = x / y;
System.out.println( z );
System.out.println("Method Two - m2");
}
}
قم بتشغيل البرنامج وشاهد ما تقدمه لك نافذة الإخراج: تم تشغيل الطريقة الرئيسية بنجاح الطريقة الأولى تقول مرحبًا!(m1) استثناء في مؤشر الترابط "الرئيسي" java.lang.ArithmeticException: / بمقدار صفر عند errorhandling.errorChecking.m2(<u >errorChecking.java:17</u>) في errorhandling.errorChecking.m1(<u>Solution.java:11</u>) في errorhandling.errorChecking.main(<u>>Solution.java:5</u >) انتهت العملية برمز الخروج 1. أنت تنظر إلى ما يسمى بتتبع المكدس. تشير الأسطر الثلاثة الموضحة باللون الأزرق إلى أساليبك، ويمكن العثور عليها في: Name_пакета.Name_класса.Name_метода
السطر الأول من الأعلى هو مكان حدوث الخطأ - في الطريقة m2
. تأكدت Java من أنه تم التعامل معها بطريقة ArithmeticException
تمنع القسمة على عدم وجود أخطاء. لا يوجد معالج أخطاء في الأساليب m2
والطرق m1
. main
لذلك قام البرنامج بمعالجتها باستخدام معالج الأخطاء الافتراضي. قم بتغيير طريقتك m1
إلى ما يلي:
try {
System.out.println("Первый метод передаёт привет!(m1)");
m2( );
}
catch (ArithmeticException err) {
System.out.println(err.getMessage());
}
لقد قمنا الآن بلف الطريقة m2
في كتلة try
. نستخدم جزئيًا catch
نوع الاستثناء الذي تم اكتشافه في تتبع المكدس - ArithmeticException
. قم بتشغيل التعليمات البرمجية مرة أخرى وسترى ما يلي في نافذة الإخراج: تم تشغيل الطريقة الرئيسية بنجاح الطريقة الأولى تقول مرحبًا!(m1) / بصفر. خروج الطريقة الرئيسية لاحظ أنه تمت طباعة رسالة الخطأ على النحو التالي: " / بصفر " . لم يتم تنفيذ الطريقة m2
بشكل كامل، ولكن تم إيقافها عند حدوث خطأ. ثم تم نقل السيطرة مرة أخرى m1
. حدث هذا بسبب حقيقة أن الكتلة catch
نفسها تعرفت على الخطأ، ولم يتصل JVM بمعالج الأخطاء القياسي، ولكنه عرض رسالة تقع بين الأقواس المتعرجة للكتلة catch
. يرجى ملاحظة أن البرنامج نفسه لم يتم إيقافه. التحكم، كالعادة، ذهب إلى الطريقة main
التي m1
تم استدعاؤه منها. وكان السطر الأخير من الطريقة main
قادرًا على عرض " طريقة النهاية الرئيسية ". هذا مهم جدا جدا. إذا كنت بحاجة إلى القيمة من m1
، للعمل اللاحق في مكان ما في main
. وإذا لم تكن القيمة موجودة، فقد لا يعمل برنامجك على الإطلاق كما تتوقع. عندما ترى تتبع المكدس في نافذة الإخراج، فاعلم فقط أن السطر الأول هو المكان الذي حدثت فيه المشكلة، والأسطر المتبقية (إذا كان هناك أي منها بالطبع) هي المكان الذي تم فيه نشر الاستثناء في المكدس، وعادةً ما ينتهي بـ main
. الترجمة من homeandlearn.co.uk نشكركم على: سيرجي سيسويف، Treefeed...
GO TO FULL VERSION