【问题标题】:Getting class cast exception using iterator or for loop使用迭代器或 for 循环获取类转换异常
【发布时间】:2013-09-06 10:53:45
【问题描述】:

我有一个列表,我需要对其进行迭代,即使在使用 Iterator 或 for 循环之后,它也会给我类转换异常,给我的问题是

代码如下,

List<DataLoaderIndex> dataList = new ArrayList<DataLoaderIndex>();

dataList = dataLoaderIndexDAO.getDataSourceStatus(uploadFrequency,reportEndDate);

Map<String,String> mapData = new HashMap<String,String>();

Iterator<DataLoaderIndex> itrObj = dataList.iterator();
            while (itrObj.hasNext()) {
                DataLoaderIndex dlObj = itrObj.next();
                String dsName = dlObj.getDataSourceType();
                    String dsStatus = dlObj.getStatus();
                    mapData.put(dsName, dsStatus);

            }

/*for(int i=0;i<dataList.size();i++){
             String dsName = dataList.get(i).getDataSourceType();
             String dsStatus = dataList.get(i).getStatus();
             mapData.put(dsName, dsStatus);
         }*/

DAO 部分在这里:

public List<DataLoaderIndex> getDataSourceStatus(String uploadFrequency,String reportEndDate){


    List<DataLoaderIndex> dataList = null;
    if(session!=null){
        Query query = session.createQuery("select dataSourceType,uploadedBy,status from DataLoaderIndex where DATE (reportEndDate) =:endate and UPPER(reportFreq) = UPPER(:uploadFreq)");  
        query.setString("endate", reportDate);
        query.setString("uploadFreq", uploadFrequency);
        dataList = query.list();
    }

    return dataList;
}

我得到了这条线的例外

String dsName = dlObj.getDataSourceType(); 

...

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.work.in.synct.entity.DataLoaderIndex
    at com.work.synct.service.dataloaderimpl.DataUploadDetailsService.getUploadStatus(DataUploadDetailsService.java:36)

【问题讨论】:

  • getDataSourceType 不是字符串。所以只有你得到了 ClassCastException
  • 你能发布 DataLoaderIndex 类吗
  • 你确定这里没有抛出异常:DataLoaderIndex dlObj = itrObj.next(); 吗? dataLoaderIndexDAO.getDataSourceStatus()的返回类型是什么?
  • 我同意@kevin 的观点,但是在输入迭代器而不是通用的迭代器时,在该行引发异常是有重要原因的。
  • @KevinBowersox :你是对的,在 DataLoaderIndex dlObj = itrObj.next(); 处抛出异常;

标签: java iterator hashmap


【解决方案1】:

DAO 方法中,查询应使用TypedQuery 进行强类型化。由于此时未键入查询,因此它返回一个List&lt;Object[]&gt;,由于类型擦除,可以将其分配给dataList。在运行时List&lt;DataLoaderIndex&gt; 会丢失其类型信息,因此可以为其分配List&lt;Object[]&gt;

List<DataLoaderIndex> dataList = null;
if(session!=null){
    TypedQuery<DataLoaderIndex> query = session.createQuery("select dataSourceType," +
        "uploadedBy,status from DataLoaderIndex where DATE " +
           " (reportEndDate) =:endate and UPPER(reportFreq) = UPPER(:uploadFreq)", 
              DataLoaderIndex.class);


    query.setString("endate", reportDate);
    query.setString("uploadFreq", uploadFrequency);
    dataList = query.list();
}

return dataList;

更新

我刚刚意识到您没有使用 JPA。而是尝试在 DAO 方法中转换返回的列表。在某些时候,您需要向上转换为 List&lt;DataLoaderList&gt;

类型

dataList = (List&lt;DataLoaderList&gt;)query.list();

【讨论】:

  • No.. 当我在 query.setString("endDate".... ..”
  • 查询中是否存在问题??我的意思不是“从 dataLoader 在哪里......”我使用的是“select blah,blah from dataLoader”??
  • @madhu 刚刚意识到您使用的是直接休眠而不是 jpa。尝试只转换 dataList,dataList = (List&lt;DataLoaderIndex&gt;)query.list();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2019-11-10
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多