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

Java程序抛出NullPointerException:无法调用Tables.getStatus()求助

Java NullPointerException问题排查与解决

错误信息

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Tables.getStatus()" because "" is null
at program.tableDraw(program.java:31)
at program.main(program.java:14)

问题代码

program类代码

public class program{
    public static void main(String[] args){
        Tables[][] gameTable = new Tables[3][3];
        for(Tables[] tables : gameTable){
            for(Tables table : tables){
                table = new Tables();
                System.out.println(table.getStatus());//->i get a return value
            }
        }
        tableDraw(gameTable);
    }
    static void tableDraw(Tables[][] gameTable){
        if(gameTable.length != 3 && gameTable[0].length != 3) {
            System.out.println("game table created wrong");
            System.exit(0);
        }
        for(Tables[] tables : gameTable){
            System.out.println();
            for(Tables table : tables){
                char c = '.';
                Tables.status stat = table.getStatus();//->java.lang.NullPointerException occur          
                if(stat == Tables.status.x) c = 'x';
                else if(stat == Tables.status.o) c = 'o';
                System.out.print(c);
            }
        }
    }
}

Tables类代码

public class Tables {
public enum status{
        blank,
        x,
        o
    }
    private status stat;
    Tables(){
        this.stat = status.blank;
    }
public status getStatus(){
        return this.stat;
    }
}

问题原因

你在增强for循环中执行table = new Tables();时,只是把新创建的Tables对象赋值给了循环的临时变量table,并没有将这个对象存入二维数组gameTable中。原数组里的所有元素依然是初始化时的null,所以在tableDraw方法中调用table.getStatus()时,自然会触发NullPointerException。

虽然循环内打印table.getStatus()能得到结果,但这个table是临时变量,和数组中的元素没有任何关联。

修复方案

改用普通for循环,通过索引直接操作数组元素,将新创建的Tables对象存入数组:

public class program{
    public static void main(String[] args){
        Tables[][] gameTable = new Tables[3][3];
        // 用索引遍历数组,直接给数组元素赋值
        for(int i = 0; i < gameTable.length; i++){
            for(int j = 0; j < gameTable[i].length; j++){
                gameTable[i][j] = new Tables();
                System.out.println(gameTable[i][j].getStatus());
            }
        }
        tableDraw(gameTable);
    }

    static void tableDraw(Tables[][] gameTable){
        if(gameTable.length != 3 && gameTable[0].length != 3) {
            System.out.println("game table created wrong");
            System.exit(0);
        }
        for(Tables[] tables : gameTable){
            System.out.println();
            for(Tables table : tables){
                char c = '.';
                Tables.status stat = table.getStatus();
                if(stat == Tables.status.x) c = 'x';
                else if(stat == Tables.status.o) c = 'o';
                System.out.print(c);
            }
        }
    }
}

补充说明

增强for循环的迭代变量是原数组元素的副本,对它进行赋值只会修改临时变量,不会影响原数组。只有通过数组索引(gameTable[i][j])直接赋值,才能真正将对象存入数组中,后续调用数组元素的方法时才不会出现空指针。

内容的提问来源于stack exchange,提问作者Ali Korkmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:10:15