从Java中的LinkedList读取对象时出现问题

时间:2018-09-17 18:03:21

标签: java

import java.io.*;
import java.util.*;
public class Bankapp {
        public static void main(String args[]) throws IOException, ClassNotFoundException   {
        String file="C:\\Users\\RaviKiran Reddy\\Desktop\\JBNR\\NewBankAccounts.csv";
        List<String[]> newAccounts=Csv.read(file);
        List<Account> openedaccounts=new LinkedList<Account>();
        for(String[] accountholdersdata:newAccounts) { 
            String name=accountholdersdata[0];
            String Ssn=accountholdersdata[1];
            String acctype=accountholdersdata[2];
            double initial_deposit=Double.parseDouble(accountholdersdata[3]);
             if(acctype=="Checking")
        openedaccounts.add(new Checking(name,Ssn,acctype,initial_deposit));
             else
              openedaccounts.add(new Savings(name,Ssn,acctype,initial_deposit));
        }
      ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("records.txt"));
      out.writeObject(opaccounts);
      ObjectInputStream in=new ObjectInputStream(new FileInputStream("records.txt"));
    LinkedList<Account> a=new LinkedList<Account>();
      a=(LinkedList<Account>)in.readObject();
      for(int i=0;i<openedaccounts.size();i++) {
          a.get(i).showInfo();// showInfo is a method used to display the account information
      }
      }
}

当我尝试从上面的代码存储和读取对象时,我收到以下错误消息:

"Exception in thread "main" java.io.InvalidClassException: bankaccountapp.Savings; no valid constructor
    at java.base/java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(Unknown Source)
    at java.base/java.io.ObjectStreamClass.checkDeserialize(Unknown Source)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
    at java.base/java.util.LinkedList.readObject(Unknown Source)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at java.base/java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    at java.base/java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.base/java.io.ObjectInputStream.readObject(Unknown Source)
    at bankaccountapp.Bankapp.main(Bankapp.java:26)".

有人可以帮助我吗?

    package bankaccountapp;
    import java.lang.String;;

    public abstract class Account {
        private String name;
        private String Ssn;
        private String AccType;
        private String Accountnumb;
        private static int unique=10000;
        int rand_numb=(int)(Math.random()*Math.pow(10,2));
        private double Accbalance;
        public Account(String name,String Ssn,String AccType,double initial_deposit) {
            unique++;
            this.name=name;
            this.Ssn=Ssn;
            this.AccType=AccType;
            this.Accbalance=initial_deposit;
            Accountnumb=unique+""+rand_numb+""+Ssn.substring(7,9);
            }

        public void deposit(int amount) {
            Accbalance=Accbalance+amount;
            System.out.println("your Account balance is:  "+Accbalance);
            }

        public void withdraw(int amount) {
            Accbalance=Accbalance-amount;
            System.out.println("your remaining balance is:   "+Accbalance);
            }

        public void showInfo() {
            System.out.println("***************");
            System.out.println("Name:  "+name+"\n"+ "Accountmunber:  "+Accountnumb+"\n"+"Acctype:  "+AccType+"\n"+"Accountbalance:  "+""+Accbalance);
            }
            }

检查班级

打包bankaccountapp;

import java.io.Serializable;

public class Checking extends Account implements Serializable {

int debitcard;
int pin; 

    public Checking(String name, String Ssn, String AccType,double initdeposit) {
        super(name, Ssn, AccType, initdeposit);
         debitcard=(int)(Math.random()*Math.pow(10, 11));
         pin=(int)(Math.random()*Math.pow(10,4));
    }

    public void showInfo() {
        super.showInfo();
        System.out.println("Debitcard:"+debitcard+"\n"+"Pin:"+pin);
    }
}

储蓄班:

package bankaccountapp;

import java.io.Serializable;

public class Savings extends Account implements Serializable{

    public Savings(String name, String Ssn, String AccType,double initdeposit) {
        super(name, Ssn, AccType, initdeposit);

    }

        public void showInfo() {
            super.showInfo();;
        }
    }

上面是我的Account(这是一个抽象类)类编码。 希望这有助于理解我的问题。 上面是我的Account(这是一个抽象类)类编码。 希望这有助于理解我的问题。

1 个答案:

答案 0 :(得分:0)

您要序列化的类必须具有no-arg构造函数。我不是绝对确定这是答案,因为您的代码有点像是墙纸,我不认为它包含要序列化的类的定义(帐户?),但这是导致错误的常见原因您列出了。

编辑:RE:新代码

如上所述,Account没有无参数的构造函数。

添加如下所示的构造函数:

公共帐户(){}

,它应该可以工作。将这种构造函数添加到要序列化的任何类中。这是序列化的要求,因为Java不知道如何创建对象以传递给构造函数...而是调用了上面的no-arg构造函数,然后将所有成员初始化为其先前的值。