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(这是一个抽象类)类编码。 希望这有助于理解我的问题。
答案 0 :(得分:0)
您要序列化的类必须具有no-arg构造函数。我不是绝对确定这是答案,因为您的代码有点像是墙纸,我不认为它包含要序列化的类的定义(帐户?),但这是导致错误的常见原因您列出了。
编辑:RE:新代码
如上所述,Account没有无参数的构造函数。
添加如下所示的构造函数:
公共帐户(){}
,它应该可以工作。将这种构造函数添加到要序列化的任何类中。这是序列化的要求,因为Java不知道如何创建对象以传递给构造函数...而是调用了上面的no-arg构造函数,然后将所有成员初始化为其先前的值。