Java에서 EOFException 처리

Mohd Mohtashim Nawaz 2023년10월12일
  1. Java IOException의 하위 클래스로서의 Java EOFException
  2. 자바 EOF 예외
  3. Java의 스트림에서 읽는 동안 EOFException 방지
Java에서 EOFException 처리

이 기사에서는 Java IOException의 하위 클래스인 Java EOFException과 Java에서 EOFException을 처리하는 방법에 대해 설명합니다.

Java IOException의 하위 클래스로서의 Java EOFException

Java EOFException은 Java IOException의 하위 클래스 또는 특정 유형이므로 EOFException을 이해하려면 IOException을 알아야 합니다.

Java는 실행 중에 프로그램에 입력 또는 출력 작업으로 인한 일부 중단이 발생했음을 알리기 위해 IOException을 throw합니다.

IOException은 확인된 예외이므로 예외를 올바르게 처리해야 합니다. try/catch 블록을 사용하거나 예외를 다시 throw하여 예외를 처리할 수 있습니다.

예외를 처리하지 않으면 JVM이 예외를 처리하고 프로그램 실행을 종료합니다.

자바 IOException의 예

스트림에서 데이터를 읽고 있고 다른 프로그램이 작업 중에 스트림을 닫을 수 있습니다. 이 경우 Java는 IOException 클래스 개체를 throw하여 IOException을 발생시킵니다.

발생하는 IOException의 다른 예로는 서버에서 읽는 동안 네트워크 오류, 디스크 공간 부족으로 인한 파일 쓰기 불가능 및 기타 파일 처리 작업이 있습니다.

예시:

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();
    }
  }
}

출력:

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)

코드는 예외를 처리하기 위해 try/catch 블록을 사용합니다.

또한 대부분의 경우 IOException 개체가 직접 throw되지 않는다는 점에 유의해야 합니다. 대신 발생한 예외에 따라 해당 하위 클래스 개체 중 하나가 throw됩니다.

자바 EOF 예외

Java 프로그램은 실행이 예기치 않게 파일의 끝이나 스트림의 끝에 도달하면 EOF(End Of File) 예외를 발생시킵니다. 이 예외는 스트림 개체를 사용하여 파일에서 내용을 읽을 때 발생합니다.

파일 끝에 도달하면 파일을 종료해야 합니다. 그러나 프로그램이 여전히 파일을 읽으려고 하면 Java가 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");
    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();
    }
  }
}

출력:

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)

예제에서 코드는 무한 루프에서 스트림을 사용하여 파일을 지속적으로 읽습니다. 따라서 파일 끝에 도달한 후에도 코드는 스트림에서 읽으려고 합니다.

이것이 EOFException이 발생하는 이유입니다.

코드는 try/catch 블록을 사용하여 EOFException을 처리하고 예외로 이어지는 스택 추적 또는 실행 추적을 인쇄합니다.

Java의 스트림에서 읽는 동안 EOFException 방지

파일 끝에 도달하는 즉시 파일 읽기 작업을 올바르게 종료하면 코드에서 EOFException을 피할 수 있습니다.

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();
    }
  }
}

출력:

1629512224
1663067168
1696622112
1730177056
1763732000
1797286944
1830842144

코드에서 예외가 발생하지 않는 것을 볼 수 있습니다. 이 코드는 스트림에 4바이트 미만이 있으면 루프가 종료된다는 조건을 정의합니다.

Java에서는 정수의 크기가 4바이트이기 때문입니다. 읽기 작업을 종료하기 위한 조건을 적절하게 정의할 수 있습니다.

또는 catch 블록을 사용하여 예외가 발생한 후 읽기 작업을 종료할 수 있지만 선호해서는 안 됩니다. 그러나 catch 블록을 사용하여 예기치 않은 입력을 피할 수 있습니다.

관련 문장 - Java Exception