1. Independentemente de haver uma exceção ou uma exceção, o código no bloco final será executado; 2. Quando houver retorno em tentativa e captura, finalmente ainda será executado; 3. Finally é executado após a operação de expressão após retorno (neste momento, o valor após a operação não é retornado, mas o valor a ser retornado é salvo primeiro, independentemente do código em finalmente, o valor retornado não mudará, mesmo que seja o valor previamente salvo), então o valor de retorno da função é determinado antes da execução final; 4. É melhor não incluir return em finalmente, caso contrário o programa sai cedo, e o valor return não é o valor de retorno salvo em try or catch. Exemplo:
Situação 1:try{} catch(){}finally{} return;
Aparentemente, o procedimento é realizado em ordem.
Situação 2:try{ return; }catch(){} finalmente{} retorno;
O programa executa o código antes do return no bloco try (incluindo a operação de expressão na instrução return);
depois execute o bloco final, e finalmente execute o retorno em try;
finalmente retorno de bloco, porque o programa retornou em try, então não é mais executado.
Situação 3:try{ } catch(){return; } finalmente{} retornar;
O programa executa try primeiro, e se encontrar uma exceção, executa o bloco de captura,
Se houver uma exceção, execute o código antes do return (incluindo a operação de expressão na instrução return) na captura e então execute todo o código na instrução final.
Por fim, execute o retorno no bloqueio de captura. Depois disso, o código em 4 lugares deixará de ser executado.
Sem exceção: Executar, tentar e finalmente retornar.
Situação 4:try{ return; }catch(){} finalmente{return; }
O programa executa o código antes do return no bloco try (incluindo a operação de expressão na instrução return);
Depois, execute o bloco final, porque há retorno no bloco final, então saia cedo.
Caso 5:try{} catch(){return; }finalmente{retorno; }
O programa executa o código antes do return (incluindo operações de expressão na instrução return) no bloco catch;
Depois, execute o bloco final, porque há retorno no bloco final, então saia cedo.
Situação 6:try{ return; }catch(){return; } finalmente{return; }
O programa executa o código antes do return no bloco try (incluindo a operação de expressão na instrução return);
Há uma exceção: executar o código antes do return (incluindo a operação de expressão na instrução return) no bloco catch;
Depois execute o bloqueio final, porque há retorno no bloco final, então ele sai cedo.
Sem exceção: então execute o bloco final novamente e saia cedo porque há retorno no bloco final.
Conclusão final: Qualquer instrução return em try ou catch é executada antes da instrução final, se finalmente existir.
Se houver uma declaração de retorno em final, então o programa retornará, então a declaração em finalmente será definitivamente devolvida.
O compilador implementa o retorno em finally como um aviso.
|