导致java.lang.ClassCastException的原因:[Ljava.lang.Object;?

时间:2011-08-31 06:11:29

标签: jsp struct

我遇到以下代码的问题:

 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 个答案:

答案 0 :(得分:2)

您的List<book> 实际一个List<Object[]>。这将导致CCE增强for循环。

当您使用JPA执行SELECT b.id, b.title FROM Book b而不是SELECT b FROM Book b之类的操作时,就会发生这种情况。


无关到具体问题,你的代码风格很差。不要使用小写启动Java类名。这让开发人员和未来的维护人员感到困惑。了解Java Naming Coventions。也不要在JSP文件中编写Java代码。 Java代码属于Java类。您应该仅在JSP文件中使用taglibs / EL。了解ServletsJSTL。您可以按照以下方式轻松完成整个循环:

<c:forEach items="${bookDeatils}" var="bookDetail">
    <tr><td>${bookDetail.id}</td></tr>
</c:forEach>

答案 1 :(得分:0)

看起来getAttribute正在返回一个数组,并且您正在尝试将其转换为数组列表。你不能这样做,而是需要将getAttribute结果保存在数组中

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

此外,它违反了标准的Java命名约定,使您的类名以小写字母开头。

答案 2 :(得分:0)

如果您发布了堆栈跟踪,我们可以确定确切的行。但是,在使用泛型集合时,混合泛型和非泛型集合是灾难的秘诀。

你的第一行应该是这样的:

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

如果getAttribute方法返回一个数组,那么使用List只能用foreach循环进行迭代是没有意义的。您可以对数组执行相同操作,但先检查它是否为空。

而且,使用小写命名类书是违反Java约定的。