【问题标题】:Serializable ArrayList -- IOException error可序列化的 ArrayList——IOException 错误
【发布时间】:2011-01-20 01:19:37
【问题描述】:

下面的代码返回一个 IOException。这是我的主要内容:

public class Main 
{

    public static void main(String[] args) {

 Book b1 = new Book(100, "The Big Book of Top Gear 2010", "Top Gear",
                "BBC Books", 120, "Book about cars.");

 Book b2 = new Book(200, "The Da Vinci Code", "Dan Brown", "Vatican", 450,
                "A fast paced thriller with riddles.");

 Book b3 = new Book(300, "Le Petit Nicolas", "Sempe Goscinny", "Folio", 156,
                "The adventures of petit Nicolas.");

 ArrayList<Book> biblia = new ArrayList<Book>();

 biblia.add(b1);

 biblia.add(b2);

 biblia.add(b3);

 File f = new File("objects");

        try {

            FileInputStream fis = new FileInputStream("objects");

            int u = fis.read();

            if (u != -1) {

                ObjectInputStream ois = new ObjectInputStream(fis);

                Bookstore b = (Bookstore) ois.readObject();

                ois.close();

            } else {

                Bookstore b = new Bookstore(biblia);

                FileOutputStream fos = new FileOutputStream("objects");

                ObjectOutputStream oos = new ObjectOutputStream(fos);

                oos.writeObject(b);

                oos.close();

            }

        } catch (FileNotFoundException ex1) {

            System.out.println("File not found.");

        } catch (IOException ex2) {

            System.out.println("IO Error.");

        } catch (ClassNotFoundException ex3) {

            System.out.println("Class not found.");

        }

}

这是 Bookstore 类,我仅使用它来存储 Book 对象的 ArrayList 以便在对象流中使用它。

public class Bookstore implements Serializable {


    private ArrayList<Book> myBooks = new ArrayList<Book>();

    public Bookstore(ArrayList<Book> biblia) {

        myBooks = biblia;

    } 

}

我也导入了所有正确的库。 我尝试做的是:如果文件不为空,则从那里读取 ArrayList(包含 ArrayList 的书店对象)。如果它是空的,请写一个新的。 问题是我返回的唯一内容是“IO 错误”。我不明白为什么。

【问题讨论】:

  • 您应该更多地考虑如何测试文件是否存在:)。你现在的做法并没有真正奏效。
  • 在 catch(IOException ex2) 块内,添加“ex2.printStackTrace();”获取您的异常发生位置的详细信息。
  • 谢谢你们。它现在似乎工作了,虽然我没有改变任何东西。 :S

标签: java serialization arraylist ioexception


【解决方案1】:

测试文件是否存在的方法是错误的。您正在尝试从不存在的文件创建流,并抛出 FileNotFoundException。而不是:

FileInputStream fis = new FileInputStream("objects");            
int u = fis.read();
if (u != -1) {

随便用

if(f.exists()) { ... }

【讨论】:

  • 我已经尝试过 if(f.exists()) { ... } Nightsorrow,我认为 fis.read() 是一种替代方案,但你是对的,它不能正常工作。跨度>
【解决方案2】:

如果您在遇到异常时打印堆栈跟踪,它将帮助您调试这些问题,但我猜 Book 是不可序列化的。

【讨论】:

    【解决方案3】:

    Nightsorrow 可能是对的。要回答为什么会出现“IO 错误”,这是因为您告诉程序打印是否存在 IO 错误。为了调试您的代码,我将删除

    catch (IOException ex2) {
    
            System.out.println("IO Error.");
    
        }
    

    您的代码部分或将其注释掉,以便您可以获取堆栈跟踪。然后您可以查明错误发生的位置和原因,因为它会给您一个异常以及抛出该异常的哪一行。

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2011-09-05
      • 2014-05-30
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多