Java 可序列化ArrayList--IOException错误

Java 可序列化ArrayList--IOException错误,java,serialization,arraylist,ioexception,Java,Serialization,Arraylist,Ioexception,下面的代码返回一个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,

下面的代码返回一个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.");

        }

}
公共类主
{
公共静态void main(字符串[]args){
b1册=新书(100本,“2010年顶级装备大书”,“顶级装备”,
“BBC图书”,120,“关于汽车的书。”);
b2册=新书(200,《达芬奇密码》,《丹·布朗》,《梵蒂冈》,《450、,
“快节奏的谜语惊悚片。”);
b3册=新书(300本,“小尼古拉斯”,“塞姆佩·戈斯辛尼”,“对开本”,156,
《小尼古拉斯历险记》);
ArrayList biblia=新的ArrayList();
增加(b1);
增加(b2);
增加(b3);
文件f=新文件(“对象”);
试一试{
FileInputStream fis=新的FileInputStream(“对象”);
int u=fis.read();
如果(u!=-1){
ObjectInputStream ois=新ObjectInputStream(fis);
书店b=(书店)ois.readObject();
ois.close();
}否则{
书店b=新书店(biblia);
FileOutputStream fos=新的FileOutputStream(“对象”);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(b);
oos.close();
}
}捕获(FileNotFoundException ex1){
System.out.println(“未找到文件”);
}捕获(IOException ex2){
System.out.println(“IO错误”);
}捕获(ClassNotFoundException ex3){
System.out.println(“未找到类”);
}
}
这是一个Bookstore类,我使用它来存储书籍对象的ArrayList,以便在对象流中使用它

public class Bookstore implements Serializable {


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

    public Bookstore(ArrayList<Book> biblia) {

        myBooks = biblia;

    } 

}
公共类书店实现可序列化{
private ArrayList myBooks=new ArrayList();
公共书店(ArrayList biblia){
我的书=圣经;
} 
}
我还导入了所有正确的库。 我尝试做的是:如果文件不是空的,那么从那里读取ArrayList(包含ArrayList的bookstore对象)。如果它是空的,那么写一个新的。
问题是我在返回中得到的唯一东西是“IO错误”我不明白为什么。

如果在出现异常时打印堆栈跟踪,将有助于调试这些问题,但我猜该书不可序列化。

如果在出现异常时打印堆栈跟踪,将有助于调试这些问题,但我猜该书不可序列化。

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

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

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

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

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

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

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

catch (IOException ex2) {

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

    }

部分代码,或对其进行注释,以便获得堆栈跟踪。然后,您可以确定错误发生的位置和原因,因为它会给您一个异常以及引发该异常的行。

Nightsoure可能是正确的。要回答为什么会出现“IO错误”这是因为你告诉程序如果有IO错误就打印。为了调试你的代码,我会删除

catch (IOException ex2) {

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

    }

部分代码,或对其进行注释,以便获得堆栈跟踪。然后,您可以确定错误发生的位置和原因,因为它会给您一个异常以及引发该异常的行。

您应该更多地考虑如何测试文件是否存在:)。您现在这样做的方式实际上不起作用我们的catch(IOException ex2)块,添加“ex2.printStackTrace();”,以获取异常发生的详细信息。谢谢大家。虽然我没有更改任何内容,但它现在似乎可以工作。请注意:SY您应该考虑更多如何测试文件是否存在:)。您现在的操作方式实际上不起作用。在catch(IOException ex2)内部块,添加“ex2.printStackTrace();”以获取异常发生位置的详细信息。谢谢大家。虽然我没有更改任何内容,但它现在似乎可以正常工作。注意:SI已经尝试了if(f.exists()){…},我认为fis.read()是一种替代方法,但您是对的,它不正确。我已经尝试了if(f.exists()){…}Nightseary和我认为fis.read()是一个替代方案,但你是对的,它不起作用。