Java在读取流时抛出InvalidClassException

时间:2019-04-11 22:08:27

标签: java serialization ioexception objectinputstream objectoutputstream

我想使用FileInputStream和ObjectInputStream从文件中读取。我创建了BankAccount类,该类实现了Externalizable接口,并@overriden了这两个方法。我不明白为什么它会引发IOException。

这些是Externalizable接口的重写方法:

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    char a = in.readChar();
    id = in.read();
    username = (String)in.readObject();
    name = (String)in.readObject();
    password = (String)in.readObject();
    amount = in.readDouble();
}

@Override
public void writeExternal(ObjectOutput out) throws IOException {
    out.writeChar('A');
    out.write(id);
    out.writeObject(username);
    out.writeObject(name);
    out.writeObject(password);
    out.writeDouble(0);
}

这是我在主类中调用这些方法的代码:

try
{    
    // Writing the object into file 
    FileOutputStream file = new FileOutputStream(path); 
    ObjectOutputStream out = new ObjectOutputStream(file); 

    // Method for serialization of object 
    out.writeObject(account);

    out.close();
    file.close();
} 
catch(IOException ex) 
{ 
    System.out.println("IOException is caught"); 
} 

try {
    //Reading object from file
    FileInputStream file = new FileInputStream(path); 
    ObjectInputStream out = new ObjectInputStream(file); 


    BankAccount bankk = (BankAccount)out.readObject();
    System.out.println(bankk);

    out.close();
    file.close();
} 
catch(IOException ex) 
{ 
    System.out.println("IOException is caught"); 
}

这就是它抛出的东西:

java.io.InvalidClassException: al.tct.bank_project.AdminAccount; no valid constructor
at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:157)
at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:862)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2038)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)
at al.tct.bank_project.BankApp$RegisterStage$1.writeToFile(BankApp.java:463)
at al.tct.bank_project.BankApp$RegisterStage$1.handle(BankApp.java:412)
at al.tct.bank_project.BankApp$RegisterStage$1.handle(BankApp.java:404)

1 个答案:

答案 0 :(得分:0)

堆栈跟踪至少包含4个有趣的信息:

[1]类型。 IOException具有子类。也许是FileNotFoundException。

[2]堆栈跟踪。这行代码指出错误在您的源文件中的何处发生,以及导致执行此方法的“调用链”。

[3]消息。例外情况可能会显示一条消息,以更多的英语进行解释。

[4]因果链。异常可能是有原因的,通常,异常本身很有趣(并且该原因可能有原因)。

还有更多(例如抑制链)。

如果您遇到异常并尝试打印它,您就搞砸了,那么打印所有这些都是很难的,但这很重要。

因此,请勿捕获异常,除非您可以实际处理它。打印错误消息或记录错误消息不处理

在这里,只需将您的方法声明为“ throws IOException”。如果这是不可能的(仅当您从不允许这样做的超类/接口扩展/实现方法时才可能发生),那么“我不知道该怎么办”代码是这样的:

catch (ExceptionICannotHandle e) {
    throw new RuntimeException(e);
}

这是确保您获得所有信息的唯一方法。

我建议您更新代码,然后您就会清楚此错误的原因。