JavaRush /وبلاگ جاوا /Random-FA /ردیابی پشته جاوا
IvanDurov
مرحله

ردیابی پشته جاوا

در گروه منتشر شد
ماشین مجازی جاوا (از این پس 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. برنامه خود را اجرا کنید و به پنجره خروجی نگاه کنید: روش Main با موفقیت اجرا می شود روش اول می گوید hello!(m1) روش دوم می گوید hello(m2) روش Main خارج می شود اگر مشکلی در متد پیش بیاید m2، JVM (ماشین مجازی جاوا) )، به یاد دارید، درست است؟) به دنبال کنترل کننده های خطا، به عنوان مثال یک بلوک خواهد بود 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");
    }
}
برنامه را اجرا کنید و ببینید پنجره خروجی چه چیزی به شما می دهد: روش Main با موفقیت اجرا شد روش اول می گوید hello!(m1) استثنا در رشته "main" 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. جاوا تضمین می‌کرد که به گونه‌ای مدیریت می‌شود ArithmeticExceptionکه تقسیم با خطای صفر باشد. هیچ کنترل کننده خطا در متدهای m2و وجود ندارد . بنابراین برنامه آن را با کنترل کننده خطای پیش فرض پردازش کرد. روش خود را به روش زیر تغییر دهید: m1mainm1
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
m2اکنون روش را در یک بلوک پیچیده ایم try. تا حدی catch، ما از نوع استثنایی استفاده می کنیم که در stack trace - ردیابی شده است ArithmeticException. کد را دوباره اجرا کنید و در پنجره خروجی موارد زیر را مشاهده خواهید کرد: روش Main با موفقیت اجرا شد روش اول می گوید hello!(m1) / توسط صفر روش Main خارج می شود توجه کنید که پیام خطا به صورت: " / by zero " چاپ شده است. . این روش m2به طور کامل اجرا نشد، اما با بروز خطا متوقف شد. سپس کنترل به عقب منتقل شد m1. این به این دلیل اتفاق افتاد که catchخود بلوک خطا را تشخیص داد؛ JVM با کنترل کننده خطای استاندارد تماس نگرفت، اما پیامی را که بین پرانتزهای فرفری بلوک قرار داشت نمایش داد catch. لطفا توجه داشته باشید که خود برنامه متوقف نشده است. کنترل طبق معمول به سراغ روشی رفت mainکه از m1آن فراخوانی شد. و آخرین خط متد قادر به نمایش " End Main methodmain " بود . این خیلی خیلی مهم است. اگر به مقدار از نیاز داشتید ، برای کارهای بعدی در جایی در . و اگر مقدار وجود نداشته باشد، ممکن است برنامه شما اصلاً آنطور که انتظار دارید کار نکند. هنگامی که دنباله پشته را در پنجره خروجی می بینید، فقط بدانید که خط اول جایی است که مشکل رخ داده است، و خطوط باقیمانده (البته اگر وجود داشته باشد) جایی است که استثنا در پشته منتشر شده است، که معمولاً با علامت ختم می شود . ترجمه از homeandlearn.co.uk ما از شما تشکر می کنیم: Sergei Sysoev، Treefeed... m1mainmain
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION