DataInputStream和DataOutputStream编译得很好,但没有按照我想要的方式运行

时间:2014-05-20 01:32:24

标签: java syntax

我正在开发一个程序,它以文本字段和两个组合框的形式获取用户输入并显示下面的总数。我已经完成了所有这些工作,但现在我正在尝试保存所选的数字,并在下次打开程序时重新读取。我认为这是通过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);
    }

2 个答案:

答案 0 :(得分:1)

您需要打印或记录您正在捕获的异常的堆栈跟踪(或至少是错误消息)。目前,您的代码丢失了导致问题的证据。 (提示:查看Exception.printStackTrace()的javadoc。)

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

这可能会为您提供足够的证据,以便您识别并解决根本问题。如果没有,请将完整的堆栈跟踪添加到您的问题中。


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

  1. 打开output ...截断现有文件。
  2. 打开input
  3. 尝试从input读取4个值。哎呀!还没有......例外。
  4. 一旦你完成了这个,你的阅读和写作方式还有其他问题:

    • 读取或写入代码似乎都没有将数据流重置为开始。
    • 读取阶段写入4个整数,写入阶段写入8个整数...以不同的顺序。

    IMO,尝试重用相同的DataInputStreamDataOutputStream对象是一个坏主意。你应该重新编码,"打开,阅读,关闭"然后"打开,写,关闭"每次......都在actionPerformed方法中。 inputoutput变量应该是局部变量,而不是实例变量。

    您的堆栈跟踪迟来的证据证实了这一诊断。

答案 1 :(得分:0)

如果您使用DataInputStream.readFully(),则需要单独捕捉EOFException。这意味着你已经用尽了输入,所以你应该关闭它并停止阅读。