1

我正在为分配编写一个小程序,其中一部分涉及使用 ObjectInputStream 从文件中读取。我遇到了一堵砖墙,因为我在尝试关闭 finally 块中的文件以及 NullPointerException 时不断收到错误,但我不明白为什么。任何帮助深表感谢!我已经检查过了,文件路径是正确的,所以它能够找到文件。

示例文件:你好 || 苹果、巴西莓、香蕉|| 购物|| 0.0005 || 是的

 public Disease[] readInCancers() {
    Disease[] cancerList = null;
    try {
        FileInputStream fis = new FileInputStream(myData);
        BufferedInputStream bis = new BufferedInputStream(fis);
        ois = new ObjectInputStream(bis);
        while(true) {
            Disease disease = null;
            try {
                disease = (Disease)ois.readObject();
            } catch (EOFException eofx) {
                break;
            }
            if (cancerList == null || cancerList.length == 0) {
                    cancerList = new Disease[1];
                    cancerList[0] = disease;
                } else {
                    Disease[] newList = new Disease[cancerList.length + 1];
                    System.arraycopy(cancerList, 0, newList, 0, cancerList.length);
                    newList[cancerList.length] = disease;
                    cancerList = newList;
                }
        }
    } catch (FileNotFoundException fnfx) {
        JOptionPane.showMessageDialog(null, "File could not be found");
    } catch (IOException iox) {
        JOptionPane.showMessageDialog(null, "Problem with reading from file");
    } catch (ClassNotFoundException cnfx) {
        JOptionPane.showMessageDialog(null, "Class could not be found");
    } catch (NullPointerException npx) {
        System.out.println("blah");
     } finally {
        try {
            ois.close();
        } catch (IOException iox) {
            JOptionPane.showMessageDialog(null, "Problem with closing file");
        }
    }
    return cancerList;
}

当我运行该程序时,它会在 ois.close() 处提供 NullPointerException 以及产生弹出“从文件读取问题”的 IOException。

我还尝试更改文件本身的结构,替换了 || (分隔符)带有一个单词甚至空格,但没有任何变化。

4

2 回答 2

3

FileInputStream正在引发异常(我猜测文件权限不正确,但您必须进一步研究);这发生在初始化之前ObjectInputStream,因此ois当您到达 finally 块时仍然为空,这会导致空指针异常。close出于这个原因,通过空指针检查在最终块中的语句之前通常是一个好主意。

于 2013-04-12T18:38:31.343 回答
1

在这种情况下,当使用ObjectInputStream输入数据时,需要采用可以读​​入序列化对象的字节格式Disease。如果格式不是预期的格式,StreamCorruptedException将抛出 a。如果您要手动更改文本文件,则可能会引发此异常,但不会显示确切的消息,因为您正在显示从文件消息读取的一般问题。

显示堆栈跟踪将有所帮助

iox.printStackTrace();

确保您将对象正确写入文件。或者,您可以使用基于文本的文件,并用于Printwriter写入、Scanner读取。您可以使用||for 作为Scanner分隔符。

于 2013-04-12T18:50:32.500 回答