Crying zebra 2019-09-12 14:51 采纳率: 50%
浏览 733
已采纳

ArrayList集合索引越界异常

在做斗地主发牌案例时 我先定义了54张牌,存储到一个集合里

ArrayList<String>Pai=new ArrayList<>();
    ArrayList<String>HuaSe=new ArrayList<>();
    ArrayList<String>DaXiao=new ArrayList<>();
    public ArrayList<String> maiPai(){
        HuaSe.add("♥");
        HuaSe.add("♠");
        HuaSe.add("♦");
        HuaSe.add("♣");
        DaXiao.add("2");
        DaXiao.add("3");
        DaXiao.add("4");
        DaXiao.add("5");
        DaXiao.add("6");
        DaXiao.add("7");
        DaXiao.add("8");
        DaXiao.add("9");
        DaXiao.add("10");
        DaXiao.add("J");
        DaXiao.add("Q");
        DaXiao.add("K");
        DaXiao.add("A");
        for (int i = 0; i < 4; i++) {
            for (int k = 0; k < 13; k++) {
                Pai.add(HuaSe.get(i)+DaXiao.get(k));
            }

        }

        Pai.add("小王");
        Pai.add("大王");
        return Pai;

    }



然后写了洗牌和发牌的代码 每个人一共发十七张 最后留三张底牌用叫地主的代码实现

 public void xiPai(ArrayList<String> list){
        Collections.shuffle(list);
    }


 public ArrayList<String> faPai(ArrayList<String> A){
        ArrayList<String> P =new ArrayList<>();
        for (int i1 = 0; i1 < 17; i1++) {
            P.add(A.get(i1));
            A.remove(i1);
        }
        return P;
    }
    public ArrayList<String> jiaoDiZhu(ArrayList<String>A){
        ArrayList<String>Q=new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Q.add(A.get(i));
            A.remove(i);

        }
        return Q;

    }

上面的代码 我都写在一个Poker类里
并在主程序中new了一个DuChang;

然后程序运行 定义了三个ArrayList进行接收扑克;

 public static void main(String[] args) {
        Poker DuChang = new Poker();
        ArrayList<String> lbs = new ArrayList<>();
        ArrayList<String> zsy = new ArrayList<>();
        ArrayList<String> lzq = new ArrayList<>();
        ArrayList<String> XiYang = DuChang.maiPai();
        DuChang.xiPai(XiYang);

        lbs = DuChang.faPai(XiYang);
        System.out.println(lbs);


        lzq = DuChang.faPai(XiYang);
        System.out.println(lzq);


        zsy=DuChang.faPai(XiYang);
        System.out.println(zsy);

然后告诉我在最后一个人发牌的时候索引越界异常

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 10 out of bounds for length 10

    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)

at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)

at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)

at java.base/java.util.Objects.checkIndex(Objects.java:372)

    at java.base/java.util.ArrayList.get(ArrayList.java:458)

    at cn.cm.DouDiZhu.Poker.faPai(Poker.java:46)

at cn.cm.DouDiZhu.YouXi.main(YouXi.java:24)

可是最后一个人发牌的时候还有20张牌在Pai的集合里啊 我只发17张,怎么会越界异常呢 而且在给前两个人发牌的时候为什么没有出现越界异常呢 后来我吧发17 张牌改成发13张 异常消失 想了两个小时 是在想不出来为什么了 求大神解惑

  • 写回答

2条回答 默认 最新

  • 毕小宝 博客专家认证 2019-09-12 14:57
    关注
     for (int i1 = 0; i1 < 17; i1++) {
                P.add(A.get(i1));
                A.remove(i1);
            }
    
    

    这里一边遍历 A 一边 remove 。那么 A 最终里面的长度就不会是 17 的,当然会越界了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 SQL Server下载
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥15 python爬取bilibili校园招聘网站
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求