尝试设置值时出现空指针异常

时间:2014-06-04 16:22:41

标签: java for-loop nullpointerexception

所以我正在制作一个名为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;
}

5 个答案:

答案 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];

所以全局变量得到一个值。