Hoje vamos falar sobre a try catch finally
ordem de execução. Em circunstâncias normais, é fácil distinguir. No trabalho real, não haverá situações muito complicadas, mas às vezes na entrevista, para testar as habilidades básicas do entrevistador, alguns muito complicados são especialmente projetados. Este artigo lhe dará um resumo, sua ordem de execução, espero ajudá-lo.
Considere o seguinte exemplo:
public class TryCatchFinallyExecutionOrderTest {
@Test
public void testGetValue1() {
System.out.println(getValue1());
}
public int getValue1() {
int value = 3;
try {
value = 6;
return value;
} finally {
value = 9;
}
}
}
Produto: 6
Quando a try
execução return
termina, o resultado a ser retornado é armazenado em uma pilha temporária. O programa não retornará imediatamente, mas executará o finally
bloco de instrução. Durante a execução value = 9
, o programa apenas substituirá o value
valor, mas não o atualizará. o valor nesta pilha temporária é executado, ele notificará o programa principal que finally{}
foi executado e pode solicitar um retorno, e o valor da pilha temporária será retirado e retornado.
A seguir, modificamos o exemplo acima:
package com.nightsoul.imaged.mp.backend;
import org.junit.Test;
public class TryCatchFinallyExecutionOrderTest {
@Test
public void testGetValue2() {
System.out.println(getValue2());
}
public int getValue2() {
int value = 3;
try {
value = 6;
return value;
} finally {
value = 9;
return value;
}
}
}
Produto: 9
O processo finally{}
perante o programa é executado é o mesmo que o código anterior, mas quando ele é executado finally{}
, ele value
ainda será substituído. Quando ele é executado return value
, ele retornará diretamente value
e terminar o programa.
Deixe-me mudar o exemplo novamente:
public class TryCatchFinallyExecutionOrderTest {
@Test
public void testGetValue3() {
System.out.println(getValue3());
}
public int getValue3() {
int value = 3;
try {
value = 1 / 0;
return value;
} catch (Exception e) {
System.out.println("Error occurs");
return value;
} finally {
value = 9;
return value;
}
}
}
Produto: 9
Ocorreu uma exceção neste programa. Após a execução catch
da saída de exceção "ocorreu uma exceção", o programa continuará a executar fianlly
e sobrescrever value
, e finalmente retornará o value
valor.
Modifique o exemplo novamente:
public class TryCatchFinallyExecutionOrderTest {
@Test
public void testGetValue4() {
System.out.println(getValue4());
}
public int getValue4() {
int value = 3;
try {
value = 1 / 0;
return value;
} catch (Exception e) {
System.out.println("Error occurs");
return value;
} finally {
value = 9;
}
}
}
Produto: 3
catch
O return
resultado em ainda será armazenado em uma pilha temporária e finally
este valor será retornado quando a execução for concluída.
Por meio do exemplo acima, podemos tirar conclusões:
-
Independentemente de haver uma exceção, o
finally
código do bloco será executado; - Quando
try
ecatch
háreturn
tempo,finally
ainda atua; finally
Éreturn
executado após o cálculo da seguinte expressão (o valor após a operação não é retornado neste momento, mas o valor a ser retornado é salvo primeiro, independentemente do código no finalmente, o valor retornado não será alterado, mas é o valor salvo antes), então o valor de retorno do método éfinally
determinado antes da execução;finally
É melhor não incluí-loreturn
, caso contrário, o programa será encerrado prematuramente e o valor de retorno não será mais o valor de retorno no blocotry
OUcatch
.
-------------------------------- FIM ----------------- --------------
Para artigos mais interessantes a tempo, preste atenção à conta pública "Java Essentials".