JavaRush /Java Blog /Random-TL /Java stack trace
IvanDurov
Antas

Java stack trace

Nai-publish sa grupo
Ang Java Virtual Machine (mula rito ay tinutukoy bilang JVM) ay nagpoproseso ng code at nagpapatakbo ng mga pamamaraan nang sunud-sunod, simula sa method main. Kapag naabot nito ang susunod na pamamaraan, sinasabi nito na ang pamamaraang ito ay nasa tuktok ng stack. Matapos ganap na maisakatuparan ang isang pamamaraan, aalisin ito sa stack at papalitan ng susunod sa pila. Upang ipakita ang prinsipyo, i-type ang code na ito: Стек-трейс 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)");
    }
}
Mayroon kaming tatlong pamamaraan: pamamaraan main, pamamaraan m1at pamamaraan m2. Kapag nagsimula ang programa, ang pamamaraan ay matatagpuan sa tuktok ng stack main. Sa loob ng pamamaraan main, ang pamamaraan ay tinatawag na m1. Kapag tinawag, tumalon siya sa tuktok ng stack. Ang pamamaraan m1naman ay tinatawag na m2. Ngayon ang pamamaraan m2ay tumalon sa tuktok ng stack, pansamantalang inaalis ang m1. Isipin ito para sa isang segundo - mainsa itaas m1at sa itaas m2! Matapos magawa ang negosyo nito, m2magtatapos ito at bumalik ang kontrol sa m1. Ang pamamaraan m1, kapag nakumpleto, ay aalisin din sa stack, at ang kontrol ay muling ibibigay sa pamamaraan main. Patakbuhin ang iyong programa at tingnan ang window ng output: Matagumpay na tumatakbo ang Pangunahing pamamaraan Ang unang pamamaraan ay nagsasabi ng hello!(m1) Ang pangalawang paraan ay nagsasabi ng hello(m2) Ang pangunahing pamamaraan ay lalabas Kung may mali sa pamamaraan m2, ang JVM (Java Virtual Machine ), naaalala mo, tama?) ay maghahanap ng mga humahawak ng error, halimbawa isang block try … catch. Kung walang mga error sa m1paraan ng error handler, ipapasa ang exception sa method m1, sa pag-asang mahawakan ito. Kung hindi ito makakita ng error handler dito, ang exception ay muling pataas sa stack, sa pagkakataong ito sa method main. Kung hindi nakuha ng pamamaraan mainang pagbubukod, makakakuha ka ng kakaibang mensahe ng error na naka-print sa window ng output. Bilang halimbawa, m2gawing ganito ang iyong pamamaraan:
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
Ang pamamaraang ito ay naglalaman ng isang dibisyon sa pamamagitan ng zero error. Narito ang buong bersyon ng programa, suriin sa iyo:
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 успешно запущен Первый метод передаёт привет!(m1) Exception in thread "main" java.lang.ArithmeticException: / by zero at errorhandling.errorChecking.m2(<u>errorChecking.java:17</u>) at errorhandling.errorChecking.m1(<u>Solution.java:11</u>) at errorhandling.errorChecking.main(<u>>Solution.java:5</u>) Process finished with exit code 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. Запустите code снова, и в окне вывода увидите следующее: Метод Main успешно запущен Первый метод передаёт привет!(m1) / by zero Метод Main заканчивает свою работу Заметьте, что сообщение об ошибке вывелось How: "/ by zero". Метод m2 не был выполнен fully, а был остановлен, когда возникла ошибка. Затем контроль был передан обратно m1. Это произошло благодаря тому, что блок catch сам распознавал ошибку, JVM не стала обращаться к стандартному обработчику ошибок, а вывела сообщение находящееся между фигурными скобками блока catch. Обратите внимание, что сама программа не была остановлена. Контроль, How обычно перешёл к методу main, откуда m1 был вызван. И последняя строка метода main, таки смогла вывести на экран "End Main method". Это имеет очень-очень важное meaning. Если бы вам нужно было meaning из m1, для последующей работы где-то в main. И если значения там не окажется, то ваша программа может отработать совсем не так, How вы ожидаете. Когда вы увидите стек-трейс в окне вывода, просто знайте, что первая строка — это то место, где проблема возникла, а остальные строки (если конечно они есть), куда исключение было передано вверх по стеку, обычно заканчивая методом main. Перевод с сайта homeandlearn.co.uk Говорим спасибо: Серегею Сысоеву, Treefeed...
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION