我想使用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)
答案 0 :(得分:0)
堆栈跟踪至少包含4个有趣的信息:
[1]类型。 IOException具有子类。也许是FileNotFoundException。
[2]堆栈跟踪。这行代码指出错误在您的源文件中的何处发生,以及导致执行此方法的“调用链”。
[3]消息。例外情况可能会显示一条消息,以更多的英语进行解释。
[4]因果链。异常可能是有原因的,通常,异常本身很有趣(并且该原因可能有原因)。
还有更多(例如抑制链)。
如果您遇到异常并尝试打印它,您就搞砸了,那么打印所有这些都是很难的,但这很重要。
因此,请勿捕获异常,除非您可以实际处理它。打印错误消息或记录错误消息不处理。
在这里,只需将您的方法声明为“ throws IOException”。如果这是不可能的(仅当您从不允许这样做的超类/接口扩展/实现方法时才可能发生),那么“我不知道该怎么办”代码是这样的:
catch (ExceptionICannotHandle e) {
throw new RuntimeException(e);
}
这是确保您获得所有信息的唯一方法。
我建议您更新代码,然后您就会清楚此错误的原因。