Technical Details 
java.lang.ClassCastException: com.casinocity.bean.GameCategory cannot be cast to java.lang.Comparable at java.util.TreeMap.put(TreeMap.java:542) at com.casinocity.front.action.HomeAction.execute(HomeAction.java:50) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:619) 

解决方案 »

  1.   

    com.casinocity.bean.GameCategory不能转换为java.lang.Comparable
    HomeAction.execute方法 中有问题,
    看看HomeAction.java:50行是不是 转换出错了
      

  2.   

    是因为你的key没有实现java.lang.Comparable接口。
    如果你不想为key实现java.lang.Comparable 接口的话,可以选择:
    TreeMap(Comparator<? super K> comparator) 
    这样的构造方法,在构造TreeMap的时候传入一个比较器。
      

  3.   

    不是啊  他第一次put 没有问题  但第二次put 的时候报错啊
      

  4.   

    public List<Game> find(long gc_id, int num) {
    Session sess = null;
    try {
    sess = getSession();
    return sess.createSQLQuery(
    "select * from game where gc_id = " + gc_id
    + " order by popularity desc limit " + num)
    .addEntity(Game.class).list();
    } catch (HibernateException e) {
    throw e;
    } finally {
    if (null != sess)
    closeSession(sess);
    }
    }
      

  5.   

    你的put方法在哪呢?
    很简单的给你打个比方;
    import java.util.Map;
    import java.util.TreeMap;public class TestMap { public static void main(String[] args) { Map<TestMap, Integer> map = new TreeMap<TestMap, Integer>(); map.put(new TestMap(), 111);
    map.put(new TestMap(), 222);
    }}
    这样就异常了,因为TestMap没有实现Comparable接口。
    改成这样:
    public class TestMap { public static void main(String[] args) { Map<String, Integer> map = new TreeMap<String, Integer>(); map.put("a", 111);
    map.put("b", 222);
    }}
    OK了,因为String实现了Comparable接口。
    如果key没有实现Comparable接口,那么你必须想办法让map知道如何对key进行比较,也就是我说的,在构造的时候指定比较器——Comparator。否则TreeMap无法比较key的大小关系,就抛异常了。
      

  6.   

    Home.action
    public String execute() throws Exception {

    // 获取总游戏数
    GameDAO gameDao = new GameDAO();
    total_games = gameDao.findAll(0).size();
    // 获取新闻列表
    newsList = new NewsBO().getNewsList(0, Constants.ALL_NEWS_TYPE, 15);
    // 随机获取一个独立奖金的游戏
    List<Game> exclusiveGameList = gameDao
    .findBySQL(" from Game where isExclusive = true order by random()");
    if (exclusiveGameList.size() > 0)
    exclusiveGame = exclusiveGameList.get(0);
    // 获取所有的游戏类别
    List<GameCategory> gcList = new GameCategoryDAO().findAll(0);
    List<Game> list ;
    for (GameCategory gc : gcList) {
    list = gameDao.find(gc.getGcId(), 4);
    System.out.println(gc+"\t:"+list);
    if(list.isEmpty())
    list=null;
    gameMap.put(gc, list);
    gameNumMap.put(gc.getGcId(), gameDao.findTotalGame(gc.getGcId()));
    }
    return SUCCESS;
    }
      

  7.   

    就是 put 第二次的时候报错啊  
      

  8.   

    这是属性  Home.action  的属性
    private List<News> newsList;
    private int total_games;
    private Game exclusiveGame;
    private List<Game> gameList;
    Map<GameCategory, List<Game>> gameMap = new TreeMap<GameCategory, List<Game>>();
    Map<Long, Integer> gameNumMap = new HashMap<Long, Integer>();
      

  9.   

    你的GameCategory并没有实现Comparable接口,第一次put的时候,map中只有一个元素,并不需要做比较,所以不抛异常。第二次put的时候,有两个元素,TreeMap需要维护一个顺序,所以要做比较,这个时候发现两个GameCategory实例无法比较,所以抛异常了。
      

  10.   

    不要以为TreeMap就自动帮你排序了,它是依据你给它的规则来排序的。而规则,要么给出一个比较器,要么实现接口。
      

  11.   

    就是我的GameCategory实体类要实现 Comparable 接口吗
      

  12.   

    请你仔细看我前面的回复。
    两种选择,要么在构造TreeMap的时候指定一个比较器。这个比较器可以比较GameCategory,并返回一个整数值作为它们的比较结果。
    要么让GameCategory实现Comparable接口,这样TreeMap就可以直接比较这两个实例了。
    都是很基础的东西,javaDoc里写的很清楚:
    public V put(K key,
                 V value)将指定值与此映射中的指定键进行关联。如果该映射以前包含此键的映射关系,那么将替换旧值。 指定者:
    接口 Map<K,V> 中的 put
    覆盖:
    类 AbstractMap<K,V> 中的 put
    参数:
    key - 要与指定值关联的键
    value - 要与指定键关联的值 
    返回:
    与 key 关联的先前值;如果没有针对 key 的映射关系,则返回 null。(返回 null 还可能表示该映射以前将 null 与 key 关联。) 
    抛出: 
    ClassCastException - 如果指定键不能与映射中的当前键进行比较 
    NullPointerException - 如果指定键为 null 并且此映射使用自然顺序,或者其比较器不允许使用 null 键