java - DataInputStream 和 DataOutputStream,编译良好,但未按我想要的方式运行

标签 java syntax

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

我已将两者编码到我的程序中,并且编译得很好,但是当我尝试输入新数据时,它会捕获它并关闭(我将 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. 打开输出 ...这会截断现有文件。
  2. 打开输入
  3. 尝试从输入读取4个值。哎呀!还没有什么……异常(exception)。

一旦你克服了这个问题,你的阅读和写作方式就会出现其他问题:

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

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

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

关于java - DataInputStream 和 DataOutputStream,编译良好,但未按我想要的方式运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23749697/

相关文章:

JavaFX TextArea如何使用自动换行符设置文本

javascript - 是否有通配符导出为的语法?

c++ - c++ 中有没有一种方法可以确保类成员函数不会更改任何类数据成员?

vim - 什么 vim 模式匹配以点结尾的数字?

macos - 浏览器中.class文件中的java版本号错误

java - 我可以在对象中实现 arrayList

java - Mybatis插入失败无一异常(exception)

emacs - 在Emacs中更改CamelCase单词的前向单词/后向单词/kill-word

postgresql - 在 Postgres 中使用 dblink 有什么捷径吗?

java - 选择具有空值的对象