Java数组索引以某种方式超出界限?

在我的游戏代码中,我正在尝试添加一张卡片。 我一做到这一点,我的arrays就出界了。 一切看起来都很正确,但也许我错过了一些东西。

仅供参考,一个和两个是播放器实例。 来自Main类的相关代码(抱歉格式化。我很沮丧将它转移到Stack Overflow):

import java.util.*; public class Program { public static void main(String args[]) { String[] rank = {"two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king", "ace"}; String[] suit = {"hearts", "diamonds", "spades", "clubs"}; Scanner scan = new Scanner(System.in); String something = "yes", something2 = "yes"; //Use with while loop String winner = "yes"; //Use for while loop String temp; //Use with setting names Card[] deck = new Card[52]; //Deck array int playercount = 0; Player one = new Player("temp"); Player two = new Player("temp"); Player three = new Player("temp"); Player four = new Player("temp"); while (something2.equals("yes") || playercount < 2) { //Add players to game System.out.println("Would a(nother) player like to join?"); something2 = scan.nextLine(); System.out.println(); if (something2.equals("yes")) { if (playercount <= 4) { if (playercount == 0) { System.out.println("What is your name: "); Player one1 = new Player(scan.nextLine()); one = one1; playercount++; System.out.println(); } else if (playercount == 1) { System.out.println("What is your name: "); Player two2 = new Player(scan.nextLine()); two = two2; playercount++; System.out.println(); } else if (playercount == 2) { System.out.println("What is your name: "); Player three3 = new Player(scan.nextLine()); three = three3; playercount++; System.out.println(); } else if (playercount == 3) { System.out.println("What is your name: "); Player four4 = new Player(scan.nextLine()); four = four4; playercount++; System.out.println(); } else {System.out.println("Only four players are allowed."); something2 = "no";} } } else if (playercount < 2) { System.out.println("You need at least two players..."); System.out.println(); } else something2 = "no"; } //Start game while (something.equals("yes")) { //Prepare game Card.makeDeck(deck, rank, suit); deck = Card.getDeck(); Card.shuffle(deck); deck = Card.getDeck(); //Deal cards if (playercount == 2) { for (int i = 1; i < 8; i++) { one.addCard(Card.draw(deck)); deck = Card.getDeck(); two.addCard(Card.draw(deck)); deck = Card.getDeck(); } } else if (playercount == 3) { for (int i = 1; i < 8; i++) { one.addCard(Card.draw(deck)); deck = Card.getDeck(); two.addCard(Card.draw(deck)); deck = Card.getDeck(); three.addCard(Card.draw(deck)); deck = Card.getDeck(); } } else { for (int i = 1; i < 8; i++) { one.addCard(Card.draw(deck)); deck = Card.getDeck(); two.addCard(Card.draw(deck)); deck = Card.getDeck(); three.addCard(Card.draw(deck)); deck = Card.getDeck(); four.addCard(Card.draw(deck)); deck = Card.getDeck(); } } } } } 

卡类:

 import java.util.*; public class Card { private String suit; private String rank; private static int temp = 0, temp2 = 0; //Use for reseting rank and suit private static Card temp3; //Use for draw method private static int temp4; //Use for shuffle method private static Card[] deck = new Card[52]; //Constructors public Card() { this.rank = "two"; this.suit = "hearts"; } public Card(String r, String s) { this.rank = r; this.suit = s; } //Mutators //Make deck public static void makeDeck(Card[] c, String[] r, String[] s) { for (int i = 0; i  12) temp = 0; if (temp2 > 3) temp2 = 0; } deck = c; } //Accessors //Return deck public static Card[] getDeck() { return deck; } //Shuffle public static Card[] shuffle(Card[] c) { for (int i = 0; i  c.length) { temp4 = (int)Math.random(); rand -= temp4; } if (rand < 0) rand += temp4; Card temp = c[i]; c[i] = c[rand]; c[rand] = temp; } deck = c; return deck; } //Draw public static Card draw(Card[] c) { if (c != null) { for (int i = 0; i < c.length; i++) { if (c[i] != null) { try { return c[i]; } finally { c[i] = null;} //Remove i from c } } } return null; } } 

玩家类:

 import java.util.*; public class Player { private String name; private Card[] hand = new Card[52]; private int handsize = 0; //Constructor public Player(String n) { name = n; } //Mutators public void addCard(Card c) { hand[handsize] = c; handsize++; } //Accessors public String getName() { return name; } public Card[] getHand() { return hand; } } 

你的循环就是问题所在

 while (something.equals("yes")) 

没有任何东西可以设置任何其他值,所以这个循环只是无休止地进行,直到所有玩家拥有超过52张牌。 一旦有人拥有超过52张卡,添加新卡会导致exception。

我想你需要删除它。 其中的代码只能运行一次。

你的绘制方法被打破了。

 // get the first non-null Card from the cards "c". public static Card draw(Card[] c) { if (c != null) { for (int i = 0; i < c.length; i++) { if (c[i] != null) { try { return c[i]; } finally { // now remove element i from the `c` array. c[i] = null; } } } } return null; } 

我认为您的代码顺序不正确(很难说这段代码)

 for (int i = 1; i < 8; i++) { one.addCard(Card.draw(deck)); deck = Card.getDeck(); two.addCard(Card.draw(deck)); deck = Card.getDeck(); } 

也许应该是

 for (int i = 1; i < 8; i++) { deck = Card.getDeck(); one.addCard(Card.draw(deck)); deck = Card.getDeck(); two.addCard(Card.draw(deck)); } 

更新

 public void addCard(Card c) { hand[handsize] = c; handsize++; } 

handsize永远不会增加 - 它始终为0