在 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
塊來避免意外輸入。