JavaRush /Blogue Java /Random-PT /Rastreamento de pilha Java
IvanDurov
Nível 25

Rastreamento de pilha Java

Publicado no grupo Random-PT
A Java Virtual Machine (doravante denominada JVM) processa o código e executa métodos um após o outro, começando com method main. Quando chega ao próximo método, diz que este método está no topo da pilha. Depois que um método é totalmente executado, ele é removido da pilha e substituído pelo próximo na fila. Para demonstrar o princípio, digite este código: Rastreamento de pilha 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)");
    }
}
Temos três métodos: método main, método m1e método m2. Quando o programa é iniciado, o método está localizado no topo da pilha main. Dentro do método main, o método é chamado m1. Quando chamado, ele salta para o topo da pilha. O método, m1por sua vez, chama o m2. Agora o método m2salta para o topo da pilha, removendo temporariamente m1. Imagine isso por um segundo – mainem cima m1e em cima m2! Tendo feito o seu trabalho, m2ele termina e o controle retorna para m1. O método m1, quando concluído, também é removido da pilha, e o controle é novamente dado ao método main. Execute seu programa e observe a janela de saída: O método Main é executado com sucesso O primeiro método diz hello!(m1) O segundo método diz hello(m2) O método Main sai Se algo der errado no método m2, a JVM (Java Virtual Machine ), você se lembra, certo?) irá procurar por manipuladores de erros, por exemplo, um block try … catch. Se não houver erros no m1método manipulador de erros, a exceção será passada para o método m1, na esperança de que ele seja capaz de tratá-la. Se ele não detectar um manipulador de erros aqui, a exceção subirá novamente na pilha, desta vez para o método main. Se o método mainnão capturar a exceção, você receberá uma mensagem de erro estranha impressa na janela de saída. Por exemplo, faça seu método m2ficar assim:
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
Este método contém um erro de divisão por zero. Aqui está a versão completa do programa, verifique com a sua:
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");
    }
}
Execute o programa e veja o que a janela de saída oferece: O método Main foi executado com sucesso O primeiro método diz hello!(m1) Exceção no thread "main" java.lang.ArithmeticException: / by zero at errorhandling.errorChecking.m2(<u >errorChecking. java:17</u>) em errorhandling.errorChecking.m1(<u>Solution.java:11</u>) em errorhandling.errorChecking.main(<u>>Solution.java:5</u >) Processo concluído com código de saída 1 Você está vendo algo chamado rastreamento de pilha. As três linhas sublinhadas em azul referem-se aos seus métodos e podem ser encontradas em: Name_пакета.Name_класса.Name_метода A primeira linha de cima é onde ocorreu o erro - no método m2. Java garantiu que fosse tratado de uma forma ArithmeticExceptionque detectasse erros de divisão por zero. Não há manipulador de erros nos métodos m2e . Portanto, o programa o processou com o manipulador de erros padrão. Mude seu método para o seguinte: m1mainm1
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
Agora envolvemos o método m2em um bloco try. Em parte catch, usamos o tipo de exceção que foi detectada no rastreamento de pilha - ArithmeticException. Execute o código novamente e você verá o seguinte na janela de saída: O método Main foi executado com sucesso O primeiro método diz hello!(m1) / by zero O método Main sai Observe que a mensagem de erro foi impressa como: " / by zero " . O método m2não foi executado completamente, mas foi interrompido quando ocorreu um erro. O controle foi então transferido de volta m1. Isso aconteceu devido ao fato do catchpróprio bloco ter reconhecido o erro; a JVM não contatou o manipulador de erros padrão, mas exibiu uma mensagem localizada entre as chaves do bloco catch. Observe que o programa em si não foi interrompido. O controle, como sempre, foi para o método maina partir do qual m1foi chamado. E a última linha do método mainfoi capaz de exibir " End Main method ". Isto é muito, muito importante. Se você precisasse do valor de m1, para trabalhos subsequentes em algum lugar em main. E se o valor não estiver lá, seu programa pode não funcionar como você espera. Ao ver o rastreamento de pilha na janela de saída, saiba que a primeira linha é onde o problema ocorreu e as linhas restantes (se houver, é claro) são onde a exceção foi propagada para cima na pilha, geralmente terminando com a extensão main. Tradução de homeandlearn.co.uk Agradecemos a: Sergei Sysoev, Treefeed...
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION