EOFException
- IO异常的子类,End of File表示流的尾部。
- 流已经到末尾了,而大部分做法是以特殊值的形式返回给我们,而不是抛异常。
- 异常是被主动抛出来的,而不是底层或者编译器主动返回。
返回特殊值处理方式
InputStream.read()
Returns:
the total number of bytes read into the buffer, or -1
if there is no more data because the end of the stream has been reached.
Throws:
IOException
– If an I/O error occurs
BufferedReader.readLine()
Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
Throws:
IOException
– If an I/O error occurs
EOFException Example
package com.cclu.socket;
import java.io.*;
import java.net.Socket;
/**
* @author ChangCheng Lu
* @date 2023/8/17 8:00
*/
public class GreetingClient {
public static void main(String[] args) {
String serverName = "127.0.0.1";
int port = Integer.parseInt("1427");
Socket client;
try {
System.out.println("连接到主机:" + serverName + " ,端口号:" + port);
// init the socket of the client
client = new Socket(serverName, port);
System.out.println("远程主机地址:" + client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("服务器响应:" + in.readUTF());
client.close();
} catch (IOException e) {
System.out.println();
}
}
}
处理建议
对于这种异常的一般解决方法就是,捕获,可以记录日志,也可以不做处理,捕获异常以后,把之前读到的数据进行后续的处理就可以了,因为那就是所以的数据。还有就是如果打算记录日志,不要把它的堆栈信息打印出来,容易给人以错觉。毕竟EOFException实质上只是一个消息而已。
当然抛异常的做法还是有一些偏激,但是当ObjectInputStream在不知道读取对象数量的情况下,确实无法判断是否读完,除非你把之前写入对象流的数量记录下来。所以说出现这个异常时就认真分析一下,这个异常是不是代表一个信息。
相关问题:
java.lang.EOFException(文件已结束异常)
当程序在输入的过程中遇到文件或流的结尾时,引发异常。因此该异常用于检查是否达到文件或流的结尾
“EOFException”
当输入期间意外终止文件或流时,将抛出“EOFException”。 以下是抛出EOFException异常的一个示例,来自JavaBeat应用程序:
import java.io.DataInputStream;import java.io.EOFException;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class ExceptionExample { public void testMethod1() { File file = new File("test.txt"); DataInputStream dataInputStream = null; try { dataInputStream = new DataInputStream(new FileInputStream(file)); while (true) { dataInputStream.readInt(); } } catch (EOFException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (dataInputStream != null) { dataInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { ExceptionExample instance1 = new ExceptionExample(); instance1.testMethod1(); }}
运行上面的程序,将抛出以下异常:
java.io.EOFExceptionat java.io.DataInputStream.readInt(DataInputStream.java:392)at logging.simple.ExceptionExample.testMethod1(ExceptionExample.java:16)at logging.simple.ExceptionExample.main(ExceptionExample.java:36)
当DataInputStream类尝试在流中读取数据但没有更多数据时,将抛出“EOFException”。它也可以发生在ObjectInputStream和RandomAccessFile类中。
原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/76665.html