为什么arraylist长度会变长?

时间:2018-04-13 20:14:35

标签: java

首先,英语不是我的主要语言,所以我为错误道歉。其次,我对Java也很陌生 我遇到了一个可能产生“战争”的分配问题。每张16张牌的两名玩家的纸牌游戏。我使用随机数作为卡值,使用两个ArrayLists来存储它们。它通常工作正常,但有时会打印出这条消息:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 17, Size: 17
根据我的理解,这意味着ArrayList由于某种原因变长了。有人可以解释原因吗? 这是我的代码:

import java.util.Random;
import java.util.ArrayList;
public class wargame{

     public static void main(String []args){
    Random rand = new Random();
    ArrayList p1 = new ArrayList ();
    ArrayList p2 = new ArrayList ();
    int tri=0, empt1, empt2, point1=0,point2=0;
    String card1="", card2="";


    do {
      int x=rand.nextInt(8) + 7 ;
      p1.add(x);

    } while (p1.size()<=16);

    do {
      int x=rand.nextInt(8) + 7 ;
      p2.add(x);

    } while (p2.size()<=16);
    System.out.println("GAME!\n");
    System.out.println(p1+"\n"+p2+"\n");

    do {
        empt1=(int)p1.get(tri);
        if (empt1>10){
        switch (empt1)
        {
         case 11: card1="jack";
         break;
         case 12: card1="queen";
         break;
         case 13: card1="king";
         break;
         case 14: card1="ace";
         break;
         default: card1="error";
         break;
        } }
        empt2=(int)p2.get(tri);
        if (empt2>10){
        switch (empt2)
        {
         case 11: card2="jack";
         break;
         case 12: card2="queen";
         break;
         case 13: card2="king";
         break;
         case 14: card2="ace";
         break;
         default: card2="error";
         break;
        } 
    }
    if (empt1>10 && empt2>10)
    {    
     System.out.println("player one drew a "+card1+" and player two drew a "+card2);}
    else 
    { 
        if (empt1<=10 && empt2>10) 
    {
     System.out.println("player one drew a "+empt1+" and player two drew a "+card2);
    }
    else {
        if (empt1<=10 && empt2<=10)
        {
            System.out.println("player one drew a "+empt1+" and player two drew a "+empt2);

        }
    else {
        System.out.println("player one drew a "+card1+" and player two drew a "+empt2);

    }
    }
     }
     if (empt1<empt2)
     {
        point2++; 
     }
     if (empt1>empt2)
     {
        point1++; 
     }
     if (empt1==empt2)
     {
         if (tri>14)
         {
            System.out.println("\neven thougha battle would occur there are too litle cards to do so. nobody gets a point");
            break;
         }
     do {


     {  System.out.println("\n\nbattle");
        tri=tri+2;
        empt1=(int)p1.get(tri);
        empt2=(int)p2.get(tri);

        if (empt1<empt2)
     {
         System.out.println("\nplayer two won the battle");
        point2=point2+3; 
     }
     if (empt1>empt2)
     {
         System.out.println("\nplayer one won the battle");
        point1=point1+3; 
     }   
     }
     }
     while (empt1==empt2);

     }
     tri++;
     }
     while (tri!=16);

    if (point1<point2)
    {
       System.out.println("\nplayer TWO wins with "+point2+" points!"); 
    }
    else {System.out.println("\nplayer ONE wins with "+point1+" points!");}

     }

}

3 个答案:

答案 0 :(得分:0)

索引从0开始,因此getIndex(0)将返回第一个值。大小以1开头,因此大小为1的arrayList将为1返回getSize()

答案 1 :(得分:0)

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 17, Size: 17

这就是说您正在尝试访问索引数组[17],但由于您的数组大小只有17,因此该索引超出范围。因此,数组大小为17将具有最高的数组索引[16]

答案 2 :(得分:0)

您的代码的问题是在您执行tri = tri +2的循环时执行。您需要学习如何调试代码,IDE是一个很棒的工具!

您遇到此问题的原因有几个。主要问题是您要向tri添加2。另一个问题是,您只需在1之间挑选一个随机数,然后再添加7。这只为您提供8种数字可能性。

运行代码时,p1设置为{14, 10, 8, 11, 10, 9, 7, 14, 14, 8, 9, 9, 13, 11, 7, 12, 14}p2设置为{12, 10, 12, 13, 9, 10, 10, 8, 14, 14, 7, 9, 9, 10, 7, 13, 14}。如您所见,有多个实例,其中两个数组在同一索引中包含相同的值。如果将tri设置为10,那么代码将通过do while循环运行,直到tri达到18,这会引发您看到的异常。 tri永远不会超过16岁。

我建议你仔细阅读你的代码并将其细分为特定的小方法,以使其更清晰。此外,您可以使用包含所有Card值的arraylist替换switch语句和if语句,这将减少您的代码行并使其不那么复杂。您可以使用cardValue[empt1]或其他内容来调用ArrayList。