5

我是 Java 编程新手,我不明白我的代码中发生了什么。

它告诉我:

Exception in thread "main" java.lang.NullPointerException
    at Main.Country.addMine(Country.java:37)
    at Main.Main.main(Main.java:21)
Java Result: 1

我的 main.java 很简单:

    Continent Europe = new Continent("Europe");
    Country asd = new Country("asd", Europe);
    Mine mine = new Mine(100,100,100,100);
    System.out.println(mine == null);
    asd.addMine(mine); //dies here

这是 addMine 方法:

public void addMine(Mine mine) {
     System.out.println(mine == null);
     this.mines.add(mine); //dies here
     this.iron += mine.iron;
     this.gold += mine.gold;
     this.stone += mine.stone;
     this.wood += mine.wood;
     System.out.println("Mine has been successfully added to the country with the given values."
);

和 Mine.java 是:

public class Mine implements Building { //Building is an empty interface :)
    protected int iron;
    protected int gold;
    protected int stone;
    protected int wood;
    public Mine(int iron, int gold, int stone, int wood) {
        this.iron += iron;
        this.gold += gold;
        this.stone += stone;
        this.wood += wood;
    }
}

如您所见,我写了 2 个 println-s 并且它们都是错误的,所以对象存在!我不明白为什么它显示 NullPointerException :(

4

4 回答 4

3

如果这失败了:

this.mines.add(mine); //dies here

...然后我怀疑mines是一个空引用。您没有显示任何声明初始化 - 但这应该是您的第一个停靠港。很可能这只是一个改变的例子:

private List<Mine> mines;

private List<Mine> mines = new ArrayList<Mine>();

或类似的东西。

于 2012-11-17T23:19:48.103 回答
1

是的,mine可能不是null,但是呢mines?我猜它是一个ArrayList<Mine>或类似的东西,你是否将它初始化为mines = new ArrayList<Mine>()?(或任何集合)

于 2012-11-17T23:20:24.467 回答
1

当您在为空的引用上调用方法时,将引发空指针异常。

this.mines.add(mine); //dies here

this.mines参考显然等于null

还要尝试使您的参考变量名称以小写字母开头。

Continent Europe = new Continent("Europe");

->

Continent europe = new Continent("Europe");

以大写字母开头的名称为类“保留”。

它在 Java 中被认为是一种很好的风格。

于 2012-11-17T23:25:56.683 回答
0

您的代码在

this.mines.add(mine);

在县级。

为了绕过错误,您应该在 County 类中创建一个局部变量(如果您没有它),它将是

private List<Mine> mines;

您将通过添加以下内容对其进行初始化

mines=new LinkedList<Mine>();

上面的事情可以写在一行代码中,但这取决于你。

private List<Mine> mines=new LinkedList<Mine>(); 

您可以使用 List 的任何其他实现。

于 2012-11-17T23:41:32.277 回答