【问题标题】:Java throws InvalidClassException while reading the streamJava 在读取流时抛出 InvalidClassException
【发布时间】:2019-09-02 15:23:32
【问题描述】:

我想使用 FileInputStream 和 ObjectInputStream 从文件中读取数据。我创建了实现 Externalizable 接口和 @overriden 两个方法的 BankAccount 类。我不明白为什么它会抛出 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)

【问题讨论】:

  • 你能显示IOException 堆栈跟踪吗?
  • 请在您的问题中进行堆栈跟踪。不要调用输入流out
  • ex.printStackTrace() 总是(除非它被记录)
  • 我发布了 IOException 堆栈跟踪...但我仍然不明白
  • 这是一个InvalidClassException,它的错误消息准确地说明了问题所在。

标签: java serialization ioexception objectinputstream objectoutputstream


【解决方案1】:

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

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

[2] 堆栈跟踪。这是一条指向源文件中发生错误的位置的行,以及导致执行此方法的“调用链”。

[3] 消息。异常可以有一条消息,用可读的英文解释更多。

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

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

如果你发现异常并尝试打印它,你搞砸了,打印所有这些很难做到,但这很重要。

所以,除非你能真正处理它,否则不要捕获异常。打印错误消息或记录它是不处理它

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 2016-04-07
    • 1970-01-01
    • 2012-12-25
    • 2016-09-13
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多