【问题标题】:java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Objectjava.lang.ClassCastException:java.lang.String 无法转换为 [Ljava.lang.Object
【发布时间】:2010-09-23 10:17:57
【问题描述】:

我正在运行以下查询。它显示一条错误消息。如何解决这个错误?

        List<Route>routeList=null;
        List<?> companyList = session.createSQLQuery ("select name " +
                                                  "from company "+
                                                  "where company_id= " + companyId).list();                 
        if(companyList.size() <= 0){
            //throw(new AppException(1018,ErrorMessages.getString("INVALID_USER_ID"))); 
        }


        routeList = new ArrayList<Route>(companyList.size());
    Route vgDetails=null;

        for (int i = 0; i < companyList.size(); i++) {

            vgDetails = new Route(); 
            Object[] row = (Object[])companyList.get(i);                                 
            vgDetails.setRouteName ((String)row[0]);                     
            routeList.add(vgDetails);       
        }                   
    session.getTransaction().commit();
        return routeList;
    }

错误是:

java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;
    at com.claystone.server.user.UserListServiceImpl.getParticipantsDestination(UserListServiceImpl.java:902)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)

【问题讨论】:

  • 您给出上述代码 sn-p 的类的名称是什么?行号?

标签: java hibernate


【解决方案1】:

你可以写:

vgDetails = new Route();                                 
vgDetails.setRouteName ((String)companyList.get(i));

companyList 已经是一个字符串列表,因为您只选择了一列。

此外,正如 Thilo 的回答还建议的那样,您可以将结果直接转换为 List&lt;string&gt; 而不是使用 List&lt;?&gt;

【讨论】:

    【解决方案2】:

    Hibernate 是返回一个 String 数组(又名 String 类型的 List)

     List<?> companyList = session.createSQLQuery ("select name " +
                                                      "from company "+
                                                      "where company_id= " + companyId).list();   
    

    因为您的查询返回 Company 表中的名称字符串。

    你必须做的返回一个列表

     List<String> companyList = (List<String>)session.createSQLQuery ("select name " +
                                                      "from company "+
                                                      "where company_id= " + companyId).list();
    

    从这里改变你的错误:

     vgDetails = new Route(); 
                Object[] row = (Object[])companyList.get(i);                                 
                vgDetails.setRouteName ((String)row[0]);                     
                routeList.add(vgDetails);
    

    到这里:

    vgDetails = new Route();                                
    vgDetails.setRouteName (companyList.get(i));                     
    routeList.add(vgDetails);
    

    companyList.get(i) 返回一个字符串。

    【讨论】:

      【解决方案3】:

      您的 companyList 包含字符串,而不是 Object[]。

      你应该写

      List<String> companyList = (List<String>) session.createSQLQuery (
            "select name from company where company_id=?", companyId).list();
      
      
      for (String routeName: companyList) {
              vgDetails = new Route();                            
              vgDetails.setRouteName (routeName);                     
              routeList.add(vgDetails);       
          }               
      

      【讨论】:

      • 这并不能解决问题,因为它仍然将演员表留给导致异常的Object[]
      • 不会再对 Object[] 进行强制转换。现在那将是一个编译错误。
      • 这很奇怪。我看到了您的答案的第一个版本,其中只描述了 List&lt;String&gt; 演员表,而不是没有演员表 Object[] 的新 for 循环实现......但我没有看到你已经编辑了你的答案......
      • @Ronald。那是一个非常快速的编辑。但即使只有第一行,也无法转换为 Object[],这要归功于泛型,它必须被删除才能编译。
      • 你是对的。它现在会变成编译时错误,而不是运行时错误。
      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 2013-07-25
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多