为什么我将null作为数组的值?

我有一个Hra1类,它定义了游戏规则(游戏= hra)。 问题是,我得到一个空值,例如poleMinci == null,尽管在构造函数中创建了数组poleMinci。 换句话说,玩家的移动方法总是返回false。

构造函数:

public Hra1() { Mince [] poleMinci = new Mince[20]; poleMinci[0] = new Mince("stříbrná", "coin.png"); poleMinci[3] = new Mince("stříbrná", "coin.png"); poleMinci[4] = new Mince("zlatá", "coin_gold.png"); poleMinci[8] = new Mince("stříbrná", "coin.png"); poleMinci[10] = new Mince("stříbrná", "coin.png"); poleMinci[12] = new Mince("stříbrná", "coin.png"); } 

玩家的移动方法:

 public boolean tahHrace(Tah tah){ if (poleMinci != null){ int odkud = tah.getZPozice(); int kam = tah.getNaPozici(); boolean kamPrazdne; if (poleMinci [kam] != null) kamPrazdne = false; else kamPrazdne = true; if (kam > odkud && poleMinci [odkud] != null && kamPrazdne == true){ poleMinci [kam] = poleMinci [odkud]; poleMinci [odkud] = null; System.out.println("hráč táhl z pozice "+tah.getZPozice() + " na pozici "+tah.getNaPozici()); return true; } else return false; } else return false; } 

你正在隐藏一个变量:

 public Hra1() { // the following variable's *scope* is inside of this constructor only // outside of the constructor, the local variable below doesn't exist. Mince [] poleMinci = new Mince[20]; poleMinci[0] = new Mince("stříbrná", "coin.png"); poleMinci[3] = new Mince("stříbrná", "coin.png"); poleMinci[4] = new Mince("zlatá", "coin_gold.png"); poleMinci[8] = new Mince("stříbrná", "coin.png"); poleMinci[10] = new Mince("stříbrná", "coin.png"); poleMinci[12] = new Mince("stříbrná", "coin.png"); } 

在该构造函数中,由于poleMinci是在构造函数内部声明的,因此它只在构造函数内部可见。 如果类中有一个同名变量,它将为null。 要解决此问题,请不要在本地重新声明变量。 做:

 public Hra1() { // Mince [] poleMinci = new Mince[20]; // **** not this **** poleMinci = new Mince[20]; // **** but this. note the difference? **** poleMinci[0] = new Mince("stříbrná", "coin.png"); poleMinci[3] = new Mince("stříbrná", "coin.png"); poleMinci[4] = new Mince("zlatá", "coin_gold.png"); poleMinci[8] = new Mince("stříbrná", "coin.png"); poleMinci[10] = new Mince("stříbrná", "coin.png"); poleMinci[12] = new Mince("stříbrná", "coin.png"); } 

有关此问题的更多信息,请查看Variable Shadowing 。 大多数IDE都会警告您可能正在执行此操作,或者设置允许它们执行此操作。 我使用Eclipse并设置了我的IDE来警告我。 你可能也希望这样做。