我遇到以下代码的问题:
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;
我做错了什么?
答案 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。了解Servlets和JSTL。您可以按照以下方式轻松完成整个循环:
<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约定的。