Java выдает InvalidClassException при чтении потока - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу читать из файла, используя 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 голосов
/ 12 апреля 2019

Трассировка стека содержит как минимум 4 интересных бита информации:

[1] Тип.IOException имеет подклассы.Возможно, это FileNotFoundException.

[2] трассировка стека.Это строка, указывающая, где в исходном файле происходит ошибка, и «цепочка вызовов», которая привела к выполнению этого метода.

[3] сообщение.Исключения могут содержать сообщения, объясняющие более понятный английский.

[4] причинно-следственная цепочка.У исключений может быть причина, и обычно это исключение само по себе интересно (и эта причина может иметь причину).

Есть даже больше (например, цепочка подавления).

Если вы когда-нибудь поймаетеисключение и попытка его напечатать, вы испортили , распечатать ВСЕ ЭТО сложно, и все же это важно.

Итак, НЕ поймайте исключение, если вы не можетена самом деле справиться с этим.распечатывая сообщение об ошибке или регистрируя его не обрабатывая его .

Здесь просто сделайте так, чтобы ваш метод был объявлен как throws IOException.Если это невозможно (может произойти, только если вы расширяете / реализуете методы из суперклассов / интерфейсов, которые не позволяют вам этого делать), то код «Я не знаю, что с этим делать» выглядит так:

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

- это единственный способ гарантировать, что вы получите всю эту информацию.

Я предлагаю вам обновить свой код, и тогда вам станет ясна причина этой ошибки.

...