Manejar EOFException en Java

Mohd Mohtashim Nawaz 12 octubre 2023
  1. Java EOFException como subclase de Java IOException
  2. la excepción EOF de Java
  3. Evite la excepción EOFException mientras lee de la transmisión en Java
Manejar EOFException en Java

Este artículo discutirá Java EOFException como una subclase de Java IOException y cómo manejar EOFException en Java.

Java EOFException como subclase de Java IOException

Java EOFException es una subclase o un tipo específico de Java IOException, por lo que debemos conocer IOException para comprender EOFException.

Java lanza la IOException para indicar que se ha producido alguna interrupción debido a la operación de entrada o salida en el programa durante la ejecución.

La IOException es una excepción comprobada, lo que significa que debemos manejar la excepción correctamente. Podemos manejar las excepciones usando un bloque try/catch o lanzando la excepción nuevamente.

Si no manejamos las excepciones, la JVM manejará la excepción y terminará la ejecución del programa.

Ejemplos de Java IOException

Podríamos estar leyendo los datos de un flujo y algún otro programa cierra el flujo durante la operación. En este caso, Java generará una IOException lanzando un objeto de clase IOException.

Otros ejemplos de IOException generadas incluyen fallas en la red al leer del servidor, incapacidad para escribir en un archivo debido a poco espacio en el disco y otras operaciones de manejo de archivos.

Ejemplo:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ExceptionExample {
  public static void main(String[] args) {
    File file = new File("MyFile.txt", "r");
    try {
      FileReader fr = new FileReader(file.getAbsoluteFile());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Producción :

java.io.FileNotFoundException: /home/stark/eclipse-workspace-java/JavaArticles/MyFile.txt/r (No such file or directory)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.io.FileReader.<init>(FileReader.java:75)
    at ExceptionExample.main(ExceptionExample.java:12)

Tenga en cuenta que el código usa el bloque try/catch para manejar la excepción.

También debemos tener en cuenta que el objeto IOException no se lanza directamente en la mayoría de los casos. En su lugar, se lanza uno de sus objetos de subclase de acuerdo con la excepción que ocurrió.

la excepción EOF de Java

Un programa Java genera una excepción EOF (fin de archivo) cuando la ejecución llega inesperadamente al final del archivo o al final de la secuencia. Esta excepción ocurre cuando leemos contenidos de archivos usando objetos de flujo.

Cuando se llega al final del archivo, debe terminarse. Sin embargo, si el programa aún intenta leer el archivo, Java genera la excepción EOFException.

Este tipo de excepción también es una excepción comprobada.

Ejemplo:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class ExceptionExample {
  public static void main(String[] args) {
    File file = new File("/home/stark/eclipse-workspace-java/JavaArticles/src/MyFile.txt");
    try {
      DataInputStream dis = new DataInputStream(new FileInputStream(file));
      int data;
      while (true) {
        data = dis.readInt();
        System.out.println(data);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (EOFException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Producción :

1629512224
1663067168
1696622112
1730177056
1763732000
1797286944
1830842144
java.io.EOFException
    at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397)
    at ExceptionExample.main(ExceptionExample.java:20)

En el ejemplo, el código lee continuamente un archivo mediante un flujo en un bucle infinito. Por lo tanto, incluso después de llegar al final del archivo, el código intenta leer el flujo.

Esta es la razón por la que obtenemos la excepción EOFException.

Debe tener en cuenta que el código maneja la excepción EOFException utilizando el bloque try/catch e imprime el seguimiento de la pila o el seguimiento de las ejecuciones que conducen a la excepción.

Evite la excepción EOFException mientras lee de la transmisión en Java

Podemos evitar la EOFException en el código si finalizamos correctamente la operación de lectura del archivo tan pronto como se alcance el final del archivo.

Veamos los cambios en el código de ejemplo anterior para evitar la excepción EOFException.

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class ExceptionExample {
  public static void main(String[] args) {
    File file = new File("/home/stark/eclipse-workspace-java/JavaArticles/src/MyFile.txt");
    int data = 0;
    try {
      DataInputStream dis = new DataInputStream(new FileInputStream(file));

      while (dis.available() > 4) {
        data = dis.readInt();
        System.out.println(data);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (EOFException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Producción :

1629512224
1663067168
1696622112
1730177056
1763732000
1797286944
1830842144

Puede ver que el código no arroja ninguna excepción. El código define una condición de que si hay menos de 4 bytes en el flujo, el bucle termina.

Esto se debe a que el tamaño del entero es de 4 bytes en Java. Puede definir sus condiciones en consecuencia para finalizar las operaciones de lectura.

Alternativamente, puede usar un bloque catch para terminar las operaciones de lectura después de que se lanza la excepción, pero no debería preferirse. Sin embargo, puede usar el bloque catch para evitar entradas inesperadas.

Artículo relacionado - Java Exception