Hola César,
El error "StackOverflowError" ocurre cuando la pila de llamadas de un programa Java se llena. En tu caso, esto sucede porque el método "metodo2()" se llama a sí mismo infinitamente, lo que se conoce como recursividad infinita. Este es un caso clásico que genera un "StackOverflowError".
Ahora, en tu caso, no estás viendo el "StackOverflowError" explícitamente porque estás atrapando y manejando las excepciones "ArithmeticException" y "NullPointerException" en tu bloque try-catch, pero no estás atrapando ni manejando el "StackOverflowError".
Si quisieras ver el "StackOverflowError" explícitamente, podrías modificar tu bloque try-catch para atrapar también el "StackOverflowError", así:
try{
metodo1();
} catch(ArithmeticException | NullPointerException | StackOverflowError ex) {
String msg = ex.getMessage();
System.out.println("Exception " + msg);
ex.printStackTrace();
}
En cuanto a tu segunda pregunta, los mensajes "Inicio del metodo 2" y "Fin del metodo 2" se imprimen porque son las primeras y últimas líneas de código que se ejecutan antes de que ocurra el "StackOverflowError". Como el "StackOverflowError" ocurre dentro del método "metodo2()", la ejecución del programa se detiene antes de que pueda imprimir cualquier otro mensaje.
Espero que esta explicación te ayude. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.
¡Vamos juntos!
Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios.