Java 由于未知原因获取运行时错误;引用ObjectInputStream

Java 由于未知原因获取运行时错误;引用ObjectInputStream,java,oop,runtime-error,Java,Oop,Runtime Error,我试图制作一个程序来存储一个类的数组,我已经表示为条目。此类根据命令、名称、编号和注释存储用户输入的注释。收到条目后,将通过ObjectInput/ObjectOutput将其发送到一个文件,并存储起来供以后使用 有点像一个简单的联系人列表,可以定期调用并随时更新 我遇到了一种奇怪的错误(见下图)。如果有人能帮我纠正这个错误,我将不胜感激 代码: import java.io.*; import java.util.Scanner; public class phone

我试图制作一个程序来存储一个类的数组,我已经表示为条目。此类根据命令、名称、编号和注释存储用户输入的注释。收到条目后,将通过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);
    }
    }
编译器错误消息(代码引用错误可在上述*之间找到):

线程“main”java.io.EOFException中的异常 在java.io.ObjectInputStream$PeekInputStream.readFully处(未知源) 位于java.io.ObjectInputStream$BlockDataInputStream.readShort(未知源) 位于java.io.ObjectInputStream.readStreamHeader(未知源) 位于java.io.ObjectInputStream。(未知源) 在phonebook.doLoad(phonebook.java:39) 在phonebook.main(phonebook.java:57)
在评论中,您确认
contacts.txt
为空。这就是引发
EOFEException
的原因。和使用一个非常特定的协议和格式,该协议和格式包括一个序列化streamheader,
ObjectInputStream
在构建时希望出现该序列化streamheader。由于文件为空,它无法读取该头,当它试图读取文件末尾以外的内容时,会抛出一个
EOFException

使用
ObjectInputStream
时,不能使用空文件。因此,如果需要它处理空文件,则不应使用
ObjectOutputStream
ObjectInputStream
,而应编写自己的文本(或二进制格式)文件。例如带有a和a和/或


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

这不是编译器错误,而是运行时错误。看起来contacts.txt是空的。@MarkrotVeel&Perception感谢各位,我将更新标题,并确认我没有搞错,我只是在将代码粘贴到原始帖子时遇到了问题。@MarkrotVeel contacts.txt是空的,因为我没有在其中放入任何内容。此程序应接受输入并将其存储在文件中供以后使用,但没有帮助。当contacts.txt不为空时会发生什么情况?@pamphlet runtime error
 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)