JavaRush /Blog Java /Random-MS /Jejak tindanan Java
IvanDurov
Tahap

Jejak tindanan Java

Diterbitkan dalam kumpulan
Mesin Maya Java (selepas ini dirujuk sebagai JVM) memproses kod dan menjalankan kaedah satu demi satu, bermula dengan kaedah main. Apabila ia mencapai kaedah seterusnya, ia mengatakan bahawa kaedah ini berada di bahagian atas timbunan. Selepas kaedah dilaksanakan sepenuhnya, ia dikeluarkan daripada timbunan dan digantikan dengan kaedah seterusnya dalam baris gilir. Untuk menunjukkan prinsip, taip kod ini: Jejak tindanan Java - 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)");
    }
}
Kami mempunyai tiga kaedah: kaedah main, kaedah m1dan kaedah m2. Apabila program bermula, kaedah ini terletak di bahagian atas timbunan main. Di dalam kaedah main, kaedah dipanggil m1. Apabila dipanggil, dia melompat ke bahagian atas timbunan. Kaedah m1seterusnya memanggil m2. Sekarang kaedah m2melompat ke bahagian atas timbunan, mengalih keluar m1. Bayangkan ini seketika - maindi atas m1dan di atas m2! Setelah menjalankan perniagaannya, m2ia berakhir dan kawalan kembali ke m1. Kaedah m1, apabila selesai, juga dialih keluar daripada timbunan, dan kawalan diberikan sekali lagi kepada kaedah main. Jalankan atur cara anda dan lihat pada tetingkap output: Kaedah Utama berjalan dengan jayanya Kaedah pertama berkata hello!(m1) Kaedah kedua berkata hello(m2) Kaedah Utama keluar Jika ada masalah dalam kaedah m2, JVM (Java Virtual Machine) ), anda masih ingat, bukan?) akan mencari pengendali ralat, contohnya block try … catch. Jika tiada ralat dalam m1kaedah pengendali ralat, maka pengecualian akan diserahkan kepada kaedah m1, dengan harapan ia akan dapat mengendalikannya. Jika ia tidak mengesan pengendali ralat di sini, pengecualian akan sekali lagi bergerak ke atas timbunan, kali ini ke kaedah main. Jika kaedah itu maintidak menangkap pengecualian, anda akan mendapat mesej ralat pelik yang dicetak dalam tetingkap output. Sebagai contoh, jadikan kaedah anda m2kelihatan seperti ini:
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
Kaedah ini mengandungi pembahagian dengan ralat sifar. Berikut ialah versi penuh program, semak dengan anda:
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");
    }
}
Jalankan atur cara dan lihat apa yang diberikan tetingkap keluaran kepada anda: Kaedah utama berjaya dijalankan Kaedah pertama menyapa!(m1) Pengecualian dalam benang "utama" java.lang.ArithmeticException: / dengan sifar pada errorhandling.errorChecking.m2(<u >errorChecking. java:17</u>) di errorhandling.errorChecking.m1(<u>Solution.java:11</u>) di errorhandling.errorChecking.main(<u>>Solution.java:5</u >) Proses selesai dengan kod keluar 1 Anda sedang melihat sesuatu yang dipanggil jejak tindanan. Tiga baris yang digariskan dalam warna biru merujuk kepada kaedah anda, dan boleh didapati dalam: Name_пакета.Name_класса.Name_метода Baris pertama dari atas ialah tempat ralat berlaku - dalam kaedah m2. Java memastikan bahawa ia dikendalikan dengan cara ArithmeticExceptionyang menangkap pembahagian dengan ralat sifar. Tiada pengendali ralat dalam m2, m1dan kaedah. mainJadi program memprosesnya dengan pengendali ralat lalai. Tukar kaedah anda m1kepada yang berikut:
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
Sekarang kita telah membungkus kaedah m2dalam blok try. Sebahagiannya catch, kami menggunakan jenis pengecualian yang telah dikesan dalam surih tindanan - ArithmeticException. Jalankan kod sekali lagi dan anda akan melihat perkara berikut dalam tetingkap output: Kaedah Utama berjalan dengan jayanya Kaedah pertama berkata hello!(m1) / dengan sifar Kaedah Utama keluar Perhatikan bahawa mesej ralat telah dicetak sebagai: " / oleh sifar " . Kaedah m2tidak dilaksanakan sepenuhnya, tetapi dihentikan apabila ralat berlaku. Kawalan kemudian dipindahkan semula m1. Ini berlaku disebabkan oleh fakta bahawa blok itu catchsendiri mengenali ralat; JVM tidak menghubungi pengendali ralat standard, tetapi memaparkan mesej yang terletak di antara pendakap kerinting blok catch. Sila ambil perhatian bahawa program itu sendiri tidak dihentikan. Kawalan, seperti biasa, pergi ke kaedah maindari mana m1ia dipanggil. Dan baris terakhir kaedah itu maindapat memaparkan " Kaedah Utama Tamat ". Ini sangat-sangat penting. Jika anda memerlukan nilai daripada m1, untuk kerja seterusnya di suatu tempat di main. Dan jika nilainya tidak ada, maka program anda mungkin tidak berfungsi sama sekali seperti yang anda jangkakan. Apabila anda melihat jejak tindanan dalam tetingkap keluaran, hanya tahu bahawa baris pertama adalah tempat masalah berlaku, dan baris yang tinggal (jika ada tentu saja) adalah tempat pengecualian disebarkan ke atas timbunan, biasanya berakhir dengan main. Terjemahan dari homeandlearn.co.uk Kami mengucapkan terima kasih kepada: Sergei Sysoev, Treefeed...
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION