Miedo a los errores, ¡pero no los escriba en Java! Probablemente ya sepas algunas cosas sobre las excepciones en Java. Hoy, al menos un conocimiento superficial te beneficiará. Vamos a analizar la clase Error y un tipo especial de excepción que asusta a muchas personas cuando aparece en sus trazas de pila.

En la cima de la jerarquía de excepciones de Java se encuentra la clase Throwable, que tiene dos descendientes:

  • Exception, que es responsable de los errores en su programa.
  • Y nuestro héroe de hoy — Error, que es responsable de los errores en la JVM.
    Vale la pena mencionar que probablemente ni siquiera sean errores de programación, sino más bien problemas que normalmente no dependen del desarrollador.

Qué hacer con un Error

Cuando se capturan "errores", no se pueden realizar acciones en el bloque catch, excepto para registrar, ya que estamos hablando de problemas en la JVM en sí.

El registro es bueno: cuando se produce un error en tiempo de ejecución, puede revisar los registros, ver su causa y saber qué corregir.

Dado que no se sabe qué tipo de error se puede obtener al escribir el código, no tiene sentido escribir un tipo específico en el bloque catch. El uso de la clase Error en sí tampoco es la mejor solución, ya que en este caso, solo se capturarán los errores.

En consecuencia, es mejor utilizar la clase Throwable, que puede capturar tanto Error como Exception. ¿Cómo se ve esto en la práctica?

No es OK escribir codigo asi:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Escribir codigo asi tampoco es OK:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Pero codigo asi, si es OK:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

La segunda opción para manejar los errores es lanzarlos hacia arriba después de declarar una cláusula throws en el método. Esta técnica se utiliza cuando su código podría teóricamente arrojar un error y desea advertir a todos los que podrían usar su código para que puedan manejar adecuadamente el error.

Errores comunes

Algunos de los errores más populares son las clases OutOfMemoryError y StackOverflowError.

OutOfMemoryError a menudo aparece cuando el programa no tiene suficiente memoria para crear objetos y el recolector de basura no puede mantener el ritmo. El resultado es un OutOfMemoryError.

Java no le permite eliminar manualmente objetos para evitar fugas de memoria, pero puede evitar ensuciar la memoria para no sobrecargar el recolector de basura y no llenar el montón.

Por ejemplo, un código como este creará una gran cantidad de basura en la memoria:


while (true) {
    new Object();
}

El segundo error sobre el que quiero hablarles es el StackOverflowError, que se produce cuando se desborda la pila de memoria. Dado que la pila almacena principalmente variables locales, parámetros y llamadas a métodos, la recursión (o una llamada recursiva a un método) es una causa muy común de este error:


public void foo() {
    foo();
}

Para evitar problemas durante la ejecución de un programa, los entornos de desarrollo integrados modernos a menudo advierten sobre la llamada de métodos de manera recursiva.

No puedes solucionar un programa que lanza Errores, pero puedes escribir código que no lance errores y rompa tu programa. Ten cuidado con la memoria, crea objetos cuidadosamente y llama a los métodos de manera correcta. Si haces eso, tendrás menos problemas en tu código.

Diferencia entre los tipos de Error y Excepción

Error Excepción
No se puede corregir en el bloque catch Se puede manejar en el bloque catch
No ocurre en tiempo de compilación Se puede capturar en tiempo de compilación
Problemas en la JVM Problemas en la lógica del código
Todos los Errores son unchecked checked y unchecked

No se puede escapar de las excepciones en Java, pero no debes tenerles miedo. Solo necesitas entender lo que representa cada tipo y saber cómo manejarlo. ¡Eso es todo por hoy! ¡Hasta pronto!