JavaIntermedio9 oct 2025

El `finally` que Siempre Tiene la Última Palabra

snippet.java
public class FinallyMystery {
    public static void main(String[] args) {
        System.out.println("Result: " + getMysteryNumber());
    }

    public static int getMysteryNumber() {
        try {
            return 10;
        } finally {
            return 20;
        }
    }
}

¿Qué crees que imprime?

Salida Esperada

Result: 10

⚠️ Salida Real

Result: 20

¿Por qué pasa esto?

¡Ah, el bloque `finally`! Ese amigo leal que **siempre** se ejecuta, pase lo que pase. Es como ese colega que se asegura de apagar las luces antes de irse, incluso si tú ya te habías despedido. Aquí, nuestro método `getMysteryNumber()` tiene planes claros: devolver `10` en el `try`. Pero, ¡sorpresa! En el bloque `finally`, también hay un `return 20`. Y aquí viene la magia negra (o la lógica JVM): - El `try` dice: "¡Me voy con un 10!" - Pero el `finally` (que es como el director del teatro) interviene y dice: "¡Un momento! Yo tengo la última palabra y mi guion dice `return 20`". 🎭 El resultado es que el valor de retorno del `finally` **eclipsa** o **anula** cualquier `return` previo del `try` o `catch`. Es una regla de oro: si un `finally` tiene un `return`, ese será el valor que se devuelva, sin importar lo que haya sucedido antes. ¡Una lección de humildad para el `try`! 😂

Conceptos relacionados

control-flowexception-handlingfinally-block