Java ObjectInputStream中的IOException和NullPointerException

Java ObjectInputStream中的IOException和NullPointerException,java,Java,我正在为作业编写一个小程序,其中一部分涉及使用ObjectInputStream读取文件。我遇到了一堵砖墙,因为我在尝试关闭finally块中的文件时不断出现错误以及NullPointerException,但我无法理解为什么。非常感谢您的帮助!我已经检查过了,文件路径是正确的,所以它能够找到文件 示例文件: 你好| | | | | | | | | | | | | | | | | 0.0005 | |是的 public Disease[] readInCancers() { Disea

我正在为作业编写一个小程序,其中一部分涉及使用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,该IOException会弹出“读取文件时出现问题”


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

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

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

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

显示堆栈跟踪将有所帮助

iox.printStackTrace();

确保将对象正确写入文件。或者,您可以使用基于文本的文件,并使用
Printwriter
进行写入,使用
Scanner
进行读取。您可以使用
|
作为
扫描仪
定界符。

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

显示堆栈跟踪将有所帮助

iox.printStackTrace();

确保将对象正确写入文件。或者,您可以使用基于文本的文件,并使用
Printwriter
进行写入,使用
Scanner
进行读取。您可以使用
|
作为
扫描仪
定界符。

您正在读取的文件是否包含这些字符串,还是包含您编写的实际疾病对象?正在读取的文件仅包含这些字符串,我想将其作为对象写入。这是您的问题。您正在尝试读取对象,但该文件包含字符串。您正在读取的文件是否仅包含这些字符串,还是包含您编写的实际疾病对象?正在读取的文件仅包含这些字符串,我希望将其作为对象写入。这是您的问题。您正在尝试读取对象,但文件包含字符串。+1,但我认为最好在知道资源非空之前不要进入try块。+1,但我认为最好在知道资源非空之前不要进入try块。