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张 异常消失 想了两个小时 是在想不出来为什么了 求大神解惑

 for (int i1 = 0; i1 < 17; i1++) {
            P.add(A.get(i1));
            A.remove(i1);
        }

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

ArrayList的底层也是数组,当你remove的时候ArrayList在变小,例如你在获取第三个人的第17张的时候此时ArrayList中只有4张且长度为4

for(itn i =17;i<0;i--){
        ...
}