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