You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:23:09