JavaRush /مدونة جافا /Random-AR /تتبع مكدس جافا
IvanDurov
مستوى

تتبع مكدس جافا

نشرت في المجموعة
يقوم Java Virtual Machine (المشار إليه فيما بعد بـ JVM) بمعالجة التعليمات البرمجية وتشغيل الطرق واحدة تلو الأخرى، بدءًا من الطريقة main. عندما تصل إلى الطريقة التالية، تقول أن هذه الطريقة موجودة في الجزء العلوي من المكدس. بعد تنفيذ الطريقة بالكامل، تتم إزالتها من المكدس واستبدالها بالطريقة التالية في قائمة الانتظار. لتوضيح المبدأ، اكتب هذا الكود: تتبع مكدس جافا - 1
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...
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION