数组越界java

时间:2015-11-21 16:56:50

标签: java

我正在尝试编写一个代码,我在其中构建一个52卡堆,然后将卡交给n个玩家(某些玩家可能有额外的卡)。获胜者是拥有黑桃王牌的人。

这是我的计划:

public class CardGame {
  public static void main(String[] args) { 
    System.out.println("Enter the number of players");

    int numofPlayers = Integer.parseInt(args[0]);
    CardPile gameDeck = CardPile.makeFullDeck(); 
    CardPile [] players = new CardPile[numofPlayers];

    for (int i=0;i<numofPlayers;i++) {
      int numofnum = i%numofPlayers;
      players[i] = new CardPile();
    }

    for (int i=0;i<52;i++) {
      int numofnum =i%numofPlayers;
      CardPile curPlayer = players[i%numofPlayers];
      Card nextCard = gameDeck.get(i);
      players[numofnum].addToBottom(nextCard); 

    }
    for (int i=1;i<numofPlayers;i++) {
      if (players[i].find(Suit.SPADES, Value.ACE) != -1) {
        System.out.println("Player" + i + "has won!");
      }
    }

  }
}

我不断出错了。我在这个程序中调用的方法写得很好所以问题应该来自这个代码。有人可以帮忙吗?

编辑:这是我得到的错误

java.lang.ArrayIndexOutOfBoundsException: 0
    at CardGame.main(CardGame.java:5)
    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 edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
> 

谢谢!

2 个答案:

答案 0 :(得分:3)

你要求的是玩家数量,而不是阅读输入;相反,你正在阅读程序的args,以确定玩家的数量。

可能你没有在命令行上传递任何参数,所以当你要求args[0]时它会抛出异常。

您希望在程序中从控制台获取输入,或者在运行程序时传递玩家数量(在这种情况下可以删除println)。

答案 1 :(得分:3)

Alex在他的回答中解释道,原因是你在运行代码时没有传递参数。如果您希望代码能够运行,那么您必须运行以下代码:

java CardGame 5 

上面执行你的CardGame类并将5作为参数传递给args [0]中的main方法。如果您通过某些IDE执行代码,请假设Eclipse,那么请在此question中查看答案,以了解如何传递参数。

如果您想更换上面的代码(接受用户输入),请替换以下行

int numofPlayers = Integer.parseInt(args[0]);

使用以下行

Scanner input= new Scanner(System.in);
int numofPlayers = input.nextInt(); 

执行代码后,会要求您输入播放器数量并输入+ ve整数值。

如果使用“扫描仪”选项,请确保根据非整数值(以及负整数)验证输入。例如,如果输入被提供为除了整数之外的任何内容,那么您将获得InputMismatchException因此,用try{} and catch(){}围绕您的输入以捕获上述异常将是正确的方法。