Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: java.util.ArrayList - PullRequest
0 голосов
/ 13 июня 2019

Я делаю проект управления библиотекой, и когда я регистрирую члена в библиотеке, он регистрируется должным образом "метод записи работает нормально". сообщение об ошибке «Исключение в потоке» AWT-EventQueue-0 »java.lang.ClassCastException: java.util.ArrayList не может быть приведен к comsatslibrary.Person сильный текст "

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 (); вот где проблема.

1 Ответ

0 голосов
/ 14 июня 2019

Ваш слушатель действия пытается прочитать объекты Person из файла "person.txt", используя ObjectInputStream.Кроме того, я бы порекомендовал другое расширение файла.«.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 объекты.

...