当前位置: 首页 > 面试题库 >

EOFException-如何处理?

丁雅懿
2023-03-14
问题内容

我是遵循Java教程的Java初学者。

我正在使用Java教程的 “
数据流”页面中的简单Java程序,并在运行时一直显示EOFException。我想知道这是否正常,因为读者最终必须走到文件末尾。

import java.io.*;

public class DataStreams {
    static final String dataFile = "F://Java//DataStreams//invoicedata.txt";

    static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
    static final int[] units = { 12, 8, 13, 29, 50 };
    static final String[] descs = {
        "Java T-shirt",
        "Java Mug",
        "Duke Juggling Dolls",
        "Java Pin",
        "Java Key Chain"
    };
    public static void main(String args[]) {
        try {
            DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));

            for (int i = 0; i < prices.length; i ++) {
                out.writeDouble(prices[i]);
                out.writeInt(units[i]);
                out.writeUTF(descs[i]);
            }

            out.close();

        } catch(IOException e){
            e.printStackTrace(); // used to be System.err.println();
        }

        double price;
        int unit;
        String desc;
        double total = 0.0;

        try {
            DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));

            while (true) {
                price = in.readDouble();
                unit = in.readInt();
                desc = in.readUTF();
                System.out.format("You ordered %d" + " units of %s at $%.2f%n",
                unit, desc, price);
                total += unit * price;
            }
        } catch(IOException e) {
            e.printStackTrace(); 
        }

        System.out.format("Your total is %f.%n" , total);
    }
}

编译正常,但输出为:

You ordered 12 units of Java T-shirt at $19.99
You ordered 8 units of Java Mug at $9.99
You ordered 13 units of Duke Juggling Dolls at $15.99
You ordered 29 units of Java Pin at $3.99
You ordered 50 units of Java Key Chain at $4.99
java.io.EOFException
        at java.io.DataInputStream.readFully(Unknown Source)
        at java.io.DataInputStream.readLong(Unknown Source)
        at java.io.DataInputStream.readDouble(Unknown Source)
        at DataStreams.main(DataStreams.java:39)
Your total is 892.880000.

在Java教程的 “
数据流页面”中,它显示:

注意,DataStreams通过捕获EOFException而不是测试无效的返回值来检测文件结束条件。DataInput方法的所有实现都使用EOFException而不是返回值。

那么,这是否意味着捕获EOFException是正常的,所以仅捕获它而不对其进行处理就可以了,这意味着已到达文件末尾?

如果这意味着我应该处理,请给我建议方法。

编辑

根据建议,我已通过将其in.available() > 0用于while循环条件进行了修复。

或者,我无能为力处理异常,因为它很好。


问题答案:

从文件读取时,您不会终止循环。因此,它读取了所有值,并在下一行的读取的下一次迭代中 正确 抛出EOFException:

 price = in.readDouble();

如果您阅读该文档,则会显示:

抛出:

EOFException-如果此输入流在读取八个字节之前到达末尾。

IOException-流已关闭,并且包含的​​输入流在关闭后不支持读取,否则会发生另一个I / O错误。

在您的while循环中放置适当的终止条件以解决问题,例如,如下所示:

     while(in.available() > 0)  <--- if there are still bytes to read


 类似资料:
  • 我序列化一个对象并将其保存为我的硬盘上的文件。当我阅读它时,只有在某些情况下它会抛出EofException。经过几个小时的调试,我无法找到一个问题。 下面是我的代码: 问题:我的序列化对象现在被破坏了,然后它现在是垃圾吗? 因为这个对象负责呈现用户保存的UI。如果用户登录,它应该呈现以前保存的UI状态。但是,对于某些用户,文件无法反序列化。

  • 我的项目是使用spring-boot web socket和嵌入式tomcat来实现聊天服务器。一切正常,但有时我得到了EOFException,然后客户端不能向聊天服务器发送消息,直到我重新启动tomcat,然后一切正常。我不知道EOFException什么时候会发生。Pls帮帮我 [TRACE]2017-10-23 06:17:10.707[http-nio-7755-exec-4]Nativ

  • 我正在尝试实现一个“帐户”列表的加载/保存,其方法与我成功使用的一个HashMap类似。 背景: 在这里我想设置我的帐户列表包括保存的帐户。 加载/保存实现: 问题是,当我第一次初始化AccountManager时,accounts.ser文件没有保存的帐户,因为该功能是在稍后的方法中实现的,因此给出了以下例外情况: 我尝试在捕获EOFExceptions时将account设置为新的ArrayLi

  • 我编写了一个监听客户机的简单服务器,当客户机连接时,它打开一个Datainputstream,读取从客户机发送的所有数据(我的客户机wirte UTF数据)。

  • 我正试图在服务器端序列化一个HashMap(Tomcat 6 . 0 . 29 ),并在客户端android应用程序上反序列化它。 我第一次尝试这个,我得到了StreamCoruptedExc的,但在我创建了一个全新的servlet与干净的doget/doPost-方法,我已经设法解决了这个问题,不幸的是,我得到了一个EOF异常,而不是。 所以,首先我发布我的代码,然后我将详细解释我的问题: 服务

  • 问题内容: 我想读取已输出到.dat文件的多个对象(我自己的类Term),但始终会得到nullPointException或EOFException。 问题答案: 请参阅Javadoc。在EOF处不返回null。它抛出异常返回null的唯一方法是在另一端写了null,这不一定是终止读取循环的一个好理由。 简而言之,您的代码是错误的。 注意,“ o”的初始化是多余的。 注意(2)您发布的代码不能为空