//poker,playerCard是ArrayList,目的是把poker里的加进playerCard,请高手看看为什么越界了public ArrayList<String> setPlayerCard() {
        Random rand = new Random();
        int j = rand.nextInt(poker.size());
        for (int i = 0; i < 39; i++) {
            while (true) {
                if (j == poker.indexOf("黑") || j == poker.indexOf("红") || j == poker.indexOf("梅") || j == poker.indexOf("方")) {
                    j = rand.nextInt(poker.size());
                } else {
                    break;
                }
            }
            if (j < poker.indexOf("红")) {
                playerCard.add(playerCard.indexOf("红"), poker.get(j));
            } else if (poker.indexOf("红") <= j && j < poker.indexOf("梅")) {
                playerCard.add(playerCard.indexOf("梅"), poker.get(j));
            } else if (poker.indexOf("梅") <= j && j < poker.indexOf("方")) {
                playerCard.add(playerCard.indexOf("方"), poker.get(j));
            } else {
                playerCard.add(poker.get(j));//Exception
            }
            poker.remove(j);
        }
        return playerCard;
    }
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 107, Size: 107
        at java.util.ArrayList.RangeCheck(ArrayList.java:547)
        at java.util.ArrayList.get(ArrayList.java:322)
        at deal.Dealer.setPlayerCard(Dealer.java:43)

解决方案 »

  1.   

    try 
    playerCard.add(poker.get( j -1));//Exception 
      

  2.   

     for (int i = 0; i < 39; i++) { //39
                while (true) { 
                    if (j == poker.indexOf("黑") || j == poker.indexOf("红") || j == poker.indexOf("梅") || j == poker.indexOf("方")) { 
                        j = rand.nextInt(poker.size()); 
                    } else { 
                        break; 
                    } 
                } 
                if (j < poker.indexOf("红")) { 
                    playerCard.add(playerCard.indexOf("红"), poker.get(j)); 
                } else if (poker.indexOf("红") <= j && j < poker.indexOf("梅")) { 
                    playerCard.add(playerCard.indexOf("梅"), poker.get(j)); 
                } else if (poker.indexOf("梅") <= j && j < poker.indexOf("方")) { 
                    playerCard.add(playerCard.indexOf("方"), poker.get(j)); 
                } else { 
                    playerCard.add(poker.get(j));//Exception 
                } 
                poker.remove(j); 
    这里移除了,你能保证到最后,poker最低都有39个数字么?
      

  3.   

    我的ArrayList的Index是按j来取的,i只是计数(背景:老师要求写一个4人三副牌升级的发牌程序,那么每个人就是39张牌和6张底牌)
      

  4.   

    嘛,size返回的应该是元素个数,而且Random生成的应该不会有index=size的情况出现啊……
    不过我也尝试了你说的方法,还是出现index=size的越界问题
      

  5.   


     for (int i = 0; i < 39; i++) { 
                while (true) { 
                    if (j == poker.indexOf("黑") || j == poker.indexOf("红") || j == poker.indexOf("梅") || j == poker.indexOf("方")) { 
                        j = rand.nextInt(poker.size()); //错误应该出在这里,楼主能保证每次for循环都执行这句吗?要是进入while后直接break的话,你的j就没有变化了,就不能保证j<poker.size()
                    } else { 
                        break; 
                    } 
                } 
                if (j < poker.indexOf("红")) { 
                    playerCard.add(playerCard.indexOf("红"), poker.get(j)); 
                } else if (poker.indexOf("红") <= j && j < poker.indexOf("梅")) { 
                    playerCard.add(playerCard.indexOf("梅"), poker.get(j)); 
                } else if (poker.indexOf("梅") <= j && j < poker.indexOf("方")) { 
                    playerCard.add(playerCard.indexOf("方"), poker.get(j)); 
                } else { 
                    playerCard.add(poker.get(j));//Exception 
                } 
                poker.remove(j); 
            } 
            
      

  6.   


    j = rand.nextInt(poker.size()); //错误应该出在这里,楼主能保证每次for循环都执行这句吗?
                         // 要是进入while后直接break的话,
                       //你的j就没有变化了,就不能保证j<poker.size()