在 Java 中處理 EOFException

Mohd Mohtashim Nawaz 2023年10月12日
  1. Java EOFException 作為 Java IOException 的子類
  2. Java EOFException
  3. 在 Java 中從流中讀取時避免 EOFException
在 Java 中處理 EOFException

本文將討論 Java EOFException 作為 Java IOException 的子類以及如何在 Java 中處理 EOFException。

Java EOFException 作為 Java IOException 的子類

Java EOFException 是 Java IOException 的子類或特定型別,所以我們應該知道 IOException 才能理解 EOFException。

Java 丟擲 IOException 表示程式在執行期間由於輸入或輸出操作發生了一些中斷。

IOException 是一個已檢查的異常,這意味著我們必須正確處理該異常。我們可以使用 try/catch 塊或再次丟擲異常來處理異常。

如果我們不處理異常,JVM 將處理異常並終止程式的執行。

Java IOException 的例子

我們可能正在從流中讀取資料,而其他一些程式在操作期間關閉了流。在這種情況下,Java 將通過丟擲 IOException 類物件來引發 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 物件。相反,它的子類物件之一根據發生的異常被丟擲。

Java EOFException

當執行意外到達檔案末尾或流末尾時,Java 程式會引發 EOF(檔案結尾)異常。當我們使用流物件從檔案中讀取內容時會發生此異常。

當到達檔案末尾時,它應該被終止。但是,如果程式仍試圖讀取該檔案,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