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:
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 m1
e 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, m1
por sua vez, chama o m2
. Agora o método m2
salta para o topo da pilha, removendo temporariamente m1
. Imagine isso por um segundo – main
em cima m1
e em cima m2
! Tendo feito o seu trabalho, m2
ele 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 m1
mé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 main
nã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 m2
ficar 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 ArithmeticException
que detectasse erros de divisão por zero. Não há manipulador de erros nos métodos m2
e . Portanto, o programa o processou com o manipulador de erros padrão. Mude seu método para o seguinte: m1
main
m1
try {
System.out.println("Первый метод передаёт привет!(m1)");
m2( );
}
catch (ArithmeticException err) {
System.out.println(err.getMessage());
}
Agora envolvemos o método m2
em 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 m2
nã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 catch
pró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 main
a partir do qual m1
foi chamado. E a última linha do método main
foi 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...
GO TO FULL VERSION