我正在做一个图书馆管理项目,当我向图书馆注册一个成员时,它的注册正确了,“写方法可以正常工作”。错误消息为“线程“ AWT-EventQueue-0”中的异常java.lang.ClassCastException:无法将java.util.ArrayList强制转换为comsatslibrary.Person strong text ”
private class listener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String user = text.getText();
String pass = text1.getText();
boolean flag = true;
ArrayList<Person> personlist = HelperClass3.readAllData("person.txt");
if (e.getSource() == b) {
for (int i = 0; i < personlist.size(); i++) {
if ((user.equals((personlist.get(i).getFirstname()))) && (pass.equals(personlist.get(i).getPassword()))) {
flag = false;
}
}
if (flag == false) {
librarian l = new librarian();
}
} else{
JOptionPane.showMessageDialog(null, "Incorrect UserName or Password");
}
}
}
}
if ((user.equals((personlist.get(i).getFirstname()))) && (pass.equals(personlist.get(i).getPassword())))
这是错误所在
我创建了一个通用的帮助器类
读取方法
public class HelperClass3 {
public static <T> ArrayList<T> readAllData(String path){
ArrayList<T> List = new ArrayList<T>(0);
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new FileInputStream(path));
boolean EOF = false;
while(!EOF) {
try {
T myObj = (T)inputStream.readObject();
List.add(myObj);
}catch (ClassNotFoundException e) {
System.out.println("Class not found");
}catch(EOFException e) {
EOF = true;
}
}
} catch(FileNotFoundException e) {
System.out.println("Cannot find file");
} catch(IOException e) {
System.out.println("IO Exception while opening stream");
} finally {
try {
if(inputStream!=null) {
inputStream.close();
}
}catch(IOException e) {
System.out.println("IO Exception while closing file");
}
}
return List;
}
写入方法
public static<T> void addArrayListToFile(T s , String path) {
ArrayList<T> List = readAllData(path);
List.add(s);
ObjectOutputStream outputStream =null;
try {
outputStream = new ObjectOutputStream(new FileOutputStream(path));
for(int i = 0 ; i < List.size() ; i++) {
outputStream.writeObject(List.get(i));
}
} catch(IOException e) {
System.out.println("IO Exception while opening file");
}
finally {
try {
if(outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
System.out.println("IO Exception while closing file");
}
}
}
}
T myObj =(T)inputStream.readObject();这就是问题所在。
答案 0 :(得分:0)
您的动作侦听器尝试使用ObjectInputStream从文件“ person.txt”中读取Person对象。顺便说一句,我建议使用其他文件扩展名。 “ .txt”表示一个文本文件,但是此文件包含对象。这是一种二进制文件,而不是纯文本。
您没有向我们显示文件的内容,也没有显示如何调用write方法填充文件;但是从方法的名称addArrayListToFile
来看,我假设您将ArrayList
传递给该方法。然后,您读取文件的内容,将整个ArrayList添加为单个元素,然后将其写回。问题在这里:
List.add(s);
参数s
是一个ArrayList,因此您可以将此对象作为单个元素添加到List
中。因此,您的文件不包含Person对象;它实际上包含ArrayList对象。执行此语句时:
if ((user.equals((personlist.get(i).getFirstname()))) && (pass.equals(personlist.get(i).getPassword()))) {
由于personlist
是泛型(参数化)类型,因此编译器会自动尝试将personlist.get(i)
强制转换为Person
对象,但是由于它实际上是ArrayList,因此会得到ClassCastException。
解决此问题的最快方法是将write方法中的上述行更改为:
List.addAll(s);
然后列表将包含Person对象而不是ArrayList对象。