繁体   English   中英

DataInputStream和DataOutputStream,可以正常编译,但不能按照我想要的方式运行

[英]DataInputStream and DataOutputStream, compiles fine but does not run the way I wanted

我正在开发一个程序,该程序以文本字段和两个组合框的形式接受用户输入,并在下面显示总计。 我已经完成所有工作,但是现在我试图保存所选的数字,并在下次打开程序时重新读取。 导致我相信这是通过datainputstream和dataoutput流完成的。

我已经在程序中都进行了编码,并且可以正常编译,但是当我尝试输入新数据时,它将捕获并关闭(我对system.exit进行了编码,以查看其是否有效)。

我可以用我的语法确定它,但是找不到。

整个程序在这里: http : //pastebin.com/9L686Pxx

编辑:格式化比我想象的要容易得多,因此这是导致程序退出的代码块。

try 
    {
            int economyCount = input.readInt();
            int standardCount = input.readInt();
            int advancedCount = input.readInt();
            int exceptionalCount = input.readInt();
            int redCount = input.readInt();
            int greenCount = input.readInt();
            int blueCount = input.readInt();
            int yellowCount = input.readInt();
    } 
    catch(IOException io)
    {
        JOptionPane.showMessageDialog(null, "The program could not read the data. Please check the disk drive and then run the program again.", "Error", JOptionPane.INFORMATION_MESSAGE);

        System.exit(1);
    }

您需要打印或记录堆栈跟踪(或至少错误消息)以获取所捕获的异常。 当前,您的代码正在丢弃导致问题的原因的证据。 (提示:在Javadoc中查看Exception.printStackTrace() 。)

或者,使用IDE的调试器运行应用程序,然后在System.exit调用上设置一个导致该应用程序退出的断点。 然后检查异常以找到其类名和消息。

机会是,这将为您提供足够的证据,以使您能够确定和解决根本问题。 如果不是,请将完整的堆栈跟踪添加到您的问题中。


基于当时发生异常的事实,我怀疑问题是您正在尝试读取尚未写入的数据。 看起来顺序是:

  1. 打开output ...会截断现有文件。
  2. 打开input
  3. 尝试从input读取4个值。 哎呀! 那里还没有...例外。

一旦超过了这一点,您的阅读和写作方式就会出现其他问题:

  • 读或写代码似乎都无法将数据流重置为开始。
  • 读取阶段正在写入4个整数,而写入阶段正在写入8个整数……以不同的顺序。

IMO,尝试重用相同的DataInputStreamDataOutputStream对象是一个坏主意。 您应该每次在actionPerformed方法中将其重新编码为“打开,读取,关闭”,然后每次“打开,写入,关闭”。 inputoutput变量应该是局部变量,而不是实例变量。

您堆栈跟踪的最新证据证实了这一诊断。

如果使用的是DataInputStream.readFully() ,则需要分别捕获EOFException 这意味着您已经用尽了输入,因此您应该关闭它并停止阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM