Java二维数组打印输出Null问题求助及原因排查
解决卡牌游戏数组输出Null的问题
嘿,我来帮你排查这个问题!你遇到的null输出问题其实有几个关键原因,咱们一步步拆解:
核心问题:卡牌数组从未被初始化
你在Kortlek类里写了buildCardGame()方法来填充卡牌数组,但在main方法中创建Kortlek对象后,从来没有调用过这个方法!这就导致cardList数组一直是默认的null值,自然调用pickCard()时返回的是null。
次要问题:数组大小不匹配
你定义的cardList是new String[3][12],但你的花色有4种(Spader、Hjarter、Ruter、Klover),点数有13个(从1到Ace)。这会导致buildCardGame()里的循环触发ArrayIndexOutOfBoundsException——因为你尝试给索引3(第4行)和索引12(第13列)赋值,但数组根本没有这些位置。
额外问题:随机索引生成错误
在pickCard()方法中,你用r.nextInt(3-1) + 1生成花色索引,这只会得到1或2,永远取不到索引0,而且如果数组修正为4行的话,也取不到索引3。同理点数的随机逻辑也一样,会漏掉部分索引。正确的随机索引应该直接用r.nextInt(数组长度),这样能覆盖所有合法索引。
修复后的代码
修改后的Tutorial类
如果不修改Kortlek构造函数,需要手动调用初始化方法:
package tutorial; import java.util.Scanner; public class Tutorial { public static void main(String[] args) { Scanner input = new Scanner(System.in); Kortlek newKortlek = new Kortlek(); // 关键:调用buildCardGame初始化卡牌数组 newKortlek.buildCardGame(); System.out.print("Please choose a name: "); String Username = input.next(); String pcName = newKortlek.nickNamePC(); String userAnswer; int userScore = 1; int pcScore = 2; do { System.out.println("You picked up: " + newKortlek.pickCard()); System.out.println(pcName + " has picked up: " + newKortlek.pickCard()); System.out.println("Do you want to continue? write yes or no"); userAnswer = input.next(); } while (!userAnswer.equals("no")); System.out.println("Your score is: " + userScore); System.out.println(pcName + "'s score is: " + pcScore); } }
修改后的Kortlek类
修正数组大小、随机索引逻辑,同时把初始化放到构造函数里,避免忘记调用:
package tutorial; import java.util.Random; public class Kortlek { Random r = new Random(); // 修正数组大小为4行(花色)13列(点数) String cardList[][] = new String[4][13]; // 构造函数:创建对象时自动初始化卡牌数组 public Kortlek() { buildCardGame(); } public String[][] buildCardGame () { String[] farg = {"Spader", "Hjarter", "Ruter", "Klover"}; String[] nummer = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "Ace"}; for (int i=0; i < farg.length; i++) { for (int j=0; j < nummer.length; j++) { cardList[i][j] = farg[i] + " " + nummer[j]; } } return cardList; } public String nickNamePC () { String[] nickName = {"Daivd", "Rahim", "Michael", "Sara", "Marie", "Jenny"}; // 简化随机逻辑:直接取0到nickName.length-1的索引 int result = r.nextInt(nickName.length); String chosenName = nickName[result]; return chosenName; } public String pickCard() { // 正确生成0-3的花色索引 int takeColor = r.nextInt(cardList.length); // 正确生成0-12的点数索引 int takeNumber = r.nextInt(cardList[0].length); String pickedCard = cardList[takeColor][takeNumber]; return pickedCard; } }
这样修改后,你的卡牌数组会被正确初始化,随机索引也能覆盖所有卡牌,就不会再输出null啦!
内容的提问来源于stack exchange,提问作者Habib
相关产品推荐
相关产品推荐

