tente pegar a ordem de execução final

Hoje vamos falar sobre a try catch finallyordem 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 tryexecução returntermina, o resultado a ser retornado é armazenado em uma pilha temporária. O programa não retornará imediatamente, mas executará o finallybloco de instrução. Durante a execução value = 9, o programa apenas substituirá o valuevalor, 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 valueainda será substituído. Quando ele é executado return value, ele retornará diretamente valuee 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 catchda saída de exceção "ocorreu uma exceção", o programa continuará a executar fianllye sobrescrever value, e finalmente retornará o valuevalor.

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

catchO returnresultado em ainda será armazenado em uma pilha temporária e finallyeste valor será retornado quando a execução for concluída.

Por meio do exemplo acima, podemos tirar conclusões:

  1. Independentemente de haver uma exceção, o finallycódigo do bloco será executado;

  2. Quando trye catchreturntempo, finallyainda atua;
  3. finallyÉ returnexecutado 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 é finallydeterminado antes da execução;
  4. finallyÉ melhor não incluí-lo return, caso contrário, o programa será encerrado prematuramente e o valor de retorno não será mais o valor de retorno no bloco tryOU catch.

-------------------------------- FIM ----------------- --------------

Para artigos mais interessantes a tempo, preste atenção à conta pública "Java Essentials".

Acho que você gosta

Origin blog.51cto.com/xtayfjpk/2675482
Recomendado
Clasificación