gpt4 book ai didi

java - 由于未知原因而出现运行时错误;引用对象输入流

转载 作者:行者123 更新时间:2023-12-01 14:42:26 25 4
gpt4 key购买 nike

我正在尝试制作一个程序来存储我表示为条目的类的数组。此类存储基于命令、名称、号码和注释的用户输入。接收到条目后,将通过 ObjectInput/ObjectOutput 将其发送到文件,并存储以供以后使用。

有点像一个简单的联系人列表,可以定期调用和不时更新。

我遇到了一种奇怪的错误(见下文)。如果有人能帮助我修复这个错误,我将不胜感激。

代码:

    import java.io.*;
import java.util.Scanner;

public class phonebook {

protected Entry[] entryList = new Entry[200];

protected int length = 0;

public void doList() {
for (int i=0; i<length; i++) {
System.out.print(entryList[i]);
}
}

public void doAddEntry(Entry entry) throws Exception {
if (length == 200) {
throw new Exception("I'm full");
}
for (int i = 0; i<length; i++) {
if (entryList[i].name.compareToIgnoreCase(entry.name) <0) {
//?
}
}
}

public void doFind(String term) {
// look for input in entryList's name fields
}

public void doSave() throws Exception {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("contacts.txt"));
os.writeObject(entryList);
os.close();
}


public void doLoad() throws Exception {
***ObjectInputStream oin = new ObjectInputStream(new FileInputStream("contacts.txt"));***
entryList = (Entry[])oin.readObject();
oin.close();
}

public static void main(String[] args) throws Exception {
String line;
String[] command;
Scanner input;
String delimeter;
delimeter = " ";
phonebook pbook;
String cmd;
String term;

pbook = new phonebook();
cmd= "";
input=new Scanner (System.in);
**pbook.doLoad();**
System.out.println("Codes are entered as 1 to 8 characters");
System.out.println("Use \"e\" for enter, \"f\" for find, \"l\" to list, and \"q\" to quit");
System.out.println();

do {
System.out.print("Command: ");
line = input.nextLine();
command = line.split(delimeter);
if (command[0].equalsIgnoreCase("e")) {
Entry e = new Entry();
e.name = command[0];
System.out.print("Enter Number: ");
e.number=input.nextLine();
System.out.print("Enter Notes: ");
e.notes=input.nextLine();
System.out.println("");
pbook.doAddEntry(e);
} else if (command[0].equalsIgnoreCase("f")) {
term=command[0];
pbook.doFind(term);
} else if (command[0].equalsIgnoreCase("l")) {
pbook.doList();
} else if (command[0].equalsIgnoreCase("q")) {
System.out.println("Exiting Program...");
pbook.doSave();
break;
} else {
System.out.println("Invalid Command");
continue;
}
} while (true);
}
}

类(class):

 public class Entry implements java.io.Serializable {
public String name;
public String number;
public String notes;
}

编译器错误消息(代码引用错误可以在上面的*之间找到):

Exception in thread "main" java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at phonebook.doLoad(phonebook.java:39)
at phonebook.main(phonebook.java:57)

最佳答案

在评论中,您确认 contacts.txt 为空。这就是抛出EOFException 的原因。 ObjectOutputStreamObjectInputStream使用非常具体的协议(protocol)和格式,其中包括 ObjectInputStream 期望在构造时出现的序列化流头。由于文件是空的,它无法读取该 header ,并且当它尝试读取超出文件末尾的内容时,会抛出 EOFException

使用ObjectInputStream时根本不能使用空文件。因此,如果您需要它处理空文件,那么您不应该使用 ObjectOutputStreamObjectInputStream,而应编写自己的文本(或二进制格式)文件。例如,带有 BufferedWriter和一个BufferedReader和/或 Scanner .

或者,您需要准备好在 doLoad 方法中处理此 EOFException 并返回空数组或 null。

关于java - 由于未知原因而出现运行时错误;引用对象输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15817371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com