Что вызывает исключение java.lang.ClassCastException: [Ljava.lang.Object ;? - PullRequest
1 голос
/ 31 августа 2011

У меня проблема со следующим кодом:

 List<book> list = new ArrayList();
    if(request.getAttribute("bookDeatils")!=null)
    {
        list = (ArrayList)request.getAttribute("bookDeatils");
            System.out.println("inside loop List --- "+list.size());
            for(book book : list)
                {
                out.println("<tr><td>"+book.getId()+"</td></tr>");
        }
          }
    System.out.printl``n(" List --- "+list.size());
%>

Показывает java.lang.ClassCastException: [Ljava.lang.Object;

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Ваш List<book> является на самом деле a List<Object[]>. Это вызовет CCE в этом расширенном цикле for.

Это может произойти, когда вы делаете что-то вроде SELECT b.id, b.title FROM Book b вместо SELECT b FROM Book b с использованием JPA.


Не имеет отношения к конкретной проблеме , ваш стиль кода очень плохой. Не начинайте имена классов Java со строчной буквы. Это сбивает с толку других разработчиков и будущих разработчиков. Изучите Соглашения об именах Java . Также не пишите код Java в файлах JSP. Java-код принадлежит классам Java. Вы должны использовать taglibs / EL только в файлах JSP. Изучите Сервлеты и JSTL . Тогда весь ваш цикл можно легко сделать следующим образом:

<c:forEach items="${bookDeatils}" var="bookDetail">
    <tr><td>${bookDetail.id}</td></tr>
</c:forEach>
0 голосов
/ 31 августа 2011

Если вы разместили трассировку стека, мы можем определить точную строку.Однако при использовании универсальных коллекций смешивание общих и неуниверсальных коллекций является причиной катастрофы.

Ваша первая строка должна выглядеть так:

    List<book> list = new ArrayList<book>();

Если метод getAttribute возвращает массивнет смысла использовать List только для итерации с циклом foreach.Вы можете сделать то же самое с массивом, но сначала убедитесь, что он не равен нулю.

А также, именование книги классов строчными буквами противоречит соглашениям Java.

0 голосов
/ 31 августа 2011

Похоже, что getAttribute возвращает массив, и вы пытаетесь преобразовать его в список массивов. Вы не можете сделать это, вместо этого вам нужно сохранить результаты getAttribute в массиве

book[] list;
list = (book[])request.getAttribute("bookDeatils");

Кроме того, в соответствии со стандартными соглашениями об именах в Java имя вашего класса должно начинаться со строчной буквы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...