所以我正在制作一个名为Spots
的虚拟对象数组,它象征着骰子的不同面孔。
它需要用户输入(本例中手动设置为3),然后创建make Spots
并将随机数从1滚动到6。
然而,当我在adady创建的rollAgain()
数组上使用Spots
方法时,我得到一个空指针,即使我在两个for循环中使用相同的变量长度(创建的那个)和一个滚动点。)
我的代码
全局变量
private Spots[] spots;
private int x = 3;
构造器
public Director(JFrame window, String args[]) {
JMenuBar menus = new JMenuBar();
window.setJMenuBar(menus);
menus.add(makeFileMenu());
window.getContentPane().add(makePanel(), BorderLayout.WEST);
window.getContentPane().add(makeSpots(x), BorderLayout.CENTER);
rollAgain();
}
rollAgain()方法
public void rollAgain() {
int v = 1 + (int) (Math.random() * 6);
for (int i = 0; i < x; i++) {
spots[i].setValue(v);
}
}
makeSpots()方法
private JComponent makeSpots(int x) {
JPanel p = new JPanel();
p.setBorder(BorderFactory.createTitledBorder("Dice"));
Spots[] spots = new Spots[x];
for (int i = 0; i < x; i++) {
spots[i] = new Spots(200, 200);
spots[i].setBorder(BorderFactory.createEtchedBorder());
p.add(spots[i]);
}
return p;
}
答案 0 :(得分:4)
您正在设置本地变量
Spots[] spots = new Spots[x];
这不会改变字段(恰好具有相同的名称)
private Spots[] spots;
最简单的解决方案是没有局部变量
this.spots = new Spots[x];
答案 1 :(得分:0)
您需要在构造函数中实例化一个新的Spots数组。
this.spots = new Spots[x];
答案 2 :(得分:0)
spots[i].setValue(v);
从这一行来看,我的猜测是数组中的Spot
对象为null。
错误在您的makeSpots()
方法中。您不会更新字段x
的值,但使用本地变量。在方法的开头添加this.x = x
。
答案 3 :(得分:0)
在makeSpots()
方法中,您将创建一个名为斑点的新Spots对象:
Spots[] spots = new Spots[x];
这有效地隐藏了方法中的私有成员变量点。相反,请在makeSpots()方法中执行此操作:
spots = new Spots[x];
答案 4 :(得分:0)
您正在声明一个全局'斑点'数组,然后在makeSpots()中使用一个名为'spots'的局部变量创建斑点。只需替换
Spots[] spots = new Spots[x];
通过
spots = new Spots[x];
所以全局变量得到一个值。