【问题标题】:Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.ArrayList线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException: java.util.ArrayList
【发布时间】:2019-06-13 13:27:19
【问题描述】:

我正在做一个图书馆管理项目,当我向图书馆注册会员时,“写入方法工作正常”。错误消息是“线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException:java.util.ArrayList 无法转换为 comsatslibrary.Personstrong 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();这就是问题所在。

【问题讨论】:

  • 你的Person类实现接口Serializable了吗?
  • 是的。 @Abra
  • 你应该遵守 Java 命名约定:变量名用驼峰命名,类名用 PascalCase。 listener 应该是 Listenerlibrarian 应该是 LibrarianList 应该是 list

标签: java exception arraylist classcastexception


【解决方案1】:

您的动作侦听器尝试使用 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。

解决此问题的最快方法是将上述写入方法中的行更改为:

List.addAll(s);

那么列表将包含 Person 对象而不是 ArrayList 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多