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
相关产品推荐
相关产品推荐

