Ejercicio Resuelto
Ejemplo resuelto: Validación de datos de usuario
Sección titulada «Ejemplo resuelto: Validación de datos de usuario»Para demostrar el uso correcto de los mecanismos de manejo de excepciones a través de:
- Validaciones internas con condiciones explícitas.
- Lanzamiento de excepciones con
throw. - Declaración de excepciones con
throws. - Manejo del error por parte del método llamador mediante
try-catch. - Verificación mediante pruebas unitarias con
assertThrowsusando JUnit 5.
Se modelará un proceso de registro de usuario donde se reciben dos parámetros: un nombre y una edad. El sistema deberá garantizar que el nombre no sea nulo ni vacío y que la edad sea mayor que cero. Si alguna de estas condiciones no se cumple, se lanzará una excepción del tipo IllegalArgumentException con un mensaje adecuado.
Adicionalmente, la responsabilidad de gestionar la excepción se delega al llamador.
1. Lógica de validación y lanzamiento de excepciones
Sección titulada «1. Lógica de validación y lanzamiento de excepciones»La clase RegistroUsuario encapsula la lógica de validación. Contiene un método público registrar, que lanza una excepción si alguno de los parámetros no cumple con los criterios establecidos.
public class RegistroUsuario {
// Método principal de registro que valida los datos public void registrar(String nombre, int edad) throws IllegalArgumentException { validarNombre(nombre); validarEdad(edad); System.out.println(" Usuario registrado: " + nombre + ", " + edad + " años..."); }
// Validación de nombre: no debe ser nulo ni vacío private void validarNombre(String nombre) { if (nombre == null || nombre.trim().isEmpty()) { throw new IllegalArgumentException(" Nombre no puede estar vacío..."); } }
// Validación de edad: debe ser un número positivo private void validarEdad(int edad) { if (edad <= 0) { throw new IllegalArgumentException(" La edad debe ser mayor que cero..."); } }}En este diseño, los métodos privados se enfocan exclusivamente en verificar las condiciones y lanzar las excepciones correspondientes, dejando el control del flujo general al método público registrar.
2. Manejo de excepciones en el método llamador (try-catch)
Sección titulada «2. Manejo de excepciones en el método llamador (try-catch)»La clase Aplicacion actúa como el cliente que consume el método de registro. Aquí se captura la excepción usando un bloque try-catch para manejar la situación de forma controlada, mostrando un mensaje apropiado al usuario final.
public class Aplicacion {
public static void main(String[] args) { ejecutarRegistroDeUsuarios(); }
private static void ejecutarRegistroDeUsuarios() { RegistroUsuario registro = new RegistroUsuario();
try { registro.registrar("Ana", 25); // caso válido registro.registrar("", 30); // error: nombre vacío } catch (IllegalArgumentException e) { System.out.println("Error al registrar usuario: " + e.getMessage()); } }}Este enfoque permite separar la lógica de validación de la lógica de interacción o presentación, siguiendo un principio de responsabilidad única.
3. Validación de errores mediante pruebas unitarias (assertThrows)
Sección titulada «3. Validación de errores mediante pruebas unitarias (assertThrows)»Para verificar que el sistema lanza las excepciones correctas en los escenarios previstos, se implementan pruebas unitarias con JUnit 5 utilizando assertThrows. Este mecanismo permite confirmar tanto el tipo como el mensaje de la excepción lanzada.
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
public class RegistroUsuarioTest {
@Test void testExcepcionSiNombreEsVacio() { RegistroUsuario registro = new RegistroUsuario();
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> { registro.registrar("", 25); });
assertEquals("El nombre no puede estar vacío.", ex.getMessage()); }
@Test void testExcepcionSiEdadEsNegativa() { RegistroUsuario registro = new RegistroUsuario();
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> { registro.registrar("Carlos", -5); });
assertEquals("La edad debe ser mayor que cero.", ex.getMessage()); }}