-1

我有一个在 CS 中到期的项目,我想创建一个 GUI 程序来充当地址簿。该程序具有添加、查找和删除联系人的功能。该程序还应该能够读取/保存联系人。我在阅读通讯录时遇到问题。这是该部分的代码。

PhoneDirectory Contacts = new PhoneDirectory(100);
private static final String DATA_FILE = "records.dat";

private static void readRecords() {
    try {
        FileInputStream fileIn = new FileInputStream(DATA_FILE);
    try (ObjectInputStream in = new ObjectInputStream(fileIn)) {
        Contacts = in.readObject();
    }
    } 
    catch (IOException | ClassNotFoundException e) {
        JOptionPane.showMessageDialog(null, "File does not exist or cannot be read.", "Error", JOptionPane.ERROR_MESSAGE);
  } 

}

在这里,我创建了一个对象“联系人”,用于存储用户输入的信息。在与行中,Contacts = in.readObject();我在与行中收到错误消息Contacts = in.readObject();。我想我明白了,因为Contacts它是一个变量而不是一个对象。

我应该在联系人上拥有什么?

这是我的项目代码的其余部分。

主班

package console;

public class Console {

    public static void main(String[] args)
    {
        PhoneBookGUI frame = new PhoneBookGUI();
        frame.setVisible(true);
    }
}

电话目录

package console;

import javax.swing.JOptionPane;

public class PhoneDirectory {
  private PhoneRecord[] records;
  private int numRecords;

  public PhoneDirectory(int size)
  {
      this.records = new PhoneRecord[size];
      this.numRecords = 0;
  }

    public PhoneRecord[] getRecords() {
        return records;
    }

    public int getNumRecords() {
        return numRecords;
    }

    public void searchRecords(String inputName)
    {
        int j;
        for (j=0; j<numRecords; j++) {
            if (records[j].getName().contains(inputName)){
                JOptionPane.showMessageDialog(null, "Name:" + " " +         records[j].getName() + "\nNumber:" +" " + records[j].getNumber(), inputName, JOptionPane.INFORMATION_MESSAGE);
                return;
            }
       }
    }

    public void deleteRecord(String contactName)
    {
        int i;
        for (i=0; i <numRecords;i++) {
            if (records[i].getName().equals(contactName)) {
                records[i] = records[numRecords-1];
                numRecords--;
            }
        }
    }

    public void updateRecord(String contactName, String phoneNumber)
    {
        int k;
        for (k=0; k<numRecords;k++) {
            if (records[k].getName().equals(contactName)) {
            records[k].setNumber(phoneNumber);
            break;
            }
        }
    }

    public void addRecord(PhoneRecord record)
    {
        if (numRecords < records.length) {
            records [numRecords] = record;
            numRecords++;
        }

        if (numRecords > records.length) {
            PhoneRecord [] tempArray = new PhoneRecord [records.length*2];
            for (int m=0; m<records.length; m++) {
                tempArray[m] = records[m];
            }
            records = tempArray;
        }
    }
}

电话记录

    package console;

// Represents a record containing a name and a phone number
class PhoneRecord {
  private String name;
  private String number;

  // Constructor
  public PhoneRecord(String personName, String phoneNumber) {
    name = personName;                       
    number = phoneNumber;
  }

  // Returns the name stored in the record
  public String getName() {
    return name;
  }

  // Returns the phone number stored in the record
  public String getNumber() {
      return number;
  }

  public void setNumber(String num) {
      this.number = num;
  }
}
4

2 回答 2

1

通常有必要将其转换回更具体的对象。

PhoneDirectory Contacts = new PhoneDirectory(100);
private static final String DATA_FILE = "records.dat";

private static void readRecords() {
    try {
        FileInputStream fileIn = new FileInputStream(DATA_FILE);
    try (ObjectInputStream in = new ObjectInputStream(fileIn)) {
        Contacts = in.readObject();

应该:

PhoneDirectory contacts = new PhoneDirectory(100);
private static final String DATA_FILE = "records.dat";

private static void readRecords() {
    try {
        FileInputStream fileIn = new FileInputStream(DATA_FILE);
    try (ObjectInputStream in = new ObjectInputStream(fileIn)) {
        contacts = (PhoneDirectory)in.readObject();  //cast the object!
于 2013-04-29T05:24:34.247 回答
0

您需要拥有该类PhoneDirectoryPhoneContant实现Serializable接口,在将 dat 文件作为对象读取时,请确保添加正确的强制转换语句。

于 2013-04-29T06:34:38.830 回答