O bloco finally sempre é executado? Armadilhas da JVM e System.exit()
Olá a todos! Sou novo em Java e estou tentando entender o tratamento de exceções. O bloco `finally` me confunde. Nos livros, dizem que ele sempre é executado, independentemente de haver uma exceção ou não. Mas encontrei alguns exemplos onde isso parece não ser verdade.
Por exemplo, este código:
```java
public class FinallyTest {
public static void main(String[] args) {
try {
System.out.println("No try");
System.exit(0);
} catch (Exception e) {
System.out.println("No catch");
} finally {
System.out.println("No finally");
}
}
}
```
Eu esperava ver "No finally", mas o programa simplesmente terminou sem essa saída. Por quê? `System.exit(0)` não é uma exceção, é um encerramento normal.
E outro exemplo. Se houver um `return` no bloco `try`, o `finally` ainda será executado? Ouvi dizer que sim, mas quero ter certeza. E o que acontece se o `finally` também lançar uma exceção? Ela sobrescreverá a exceção do `try`?