【问题标题】:Java NullPointerException - Short ProgramJava NullPointerException - 短程序
【发布时间】:2012-11-06 07:24:52
【问题描述】:

我是 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 :(

【问题讨论】:

  • 我猜“地雷”是 Country 的某种动态列表?在您尝试添加之前它是否已初始化?
  • 你初始化地雷了吗?我猜这是一个数组列表。
  • 你能告诉我们你是如何声明mines的吗?
  • @JeremyD:它不能是数组,因为数组没有add 方法。
  • @JonSkeet 是的,我在想一个数组列表,但输入错误:)

标签: java exception nullpointerexception runtime-error main


【解决方案1】:

你的代码在

中失败了
this.mines.add(mine);

在县级。

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

private List<Mine> mines;

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

mines=new LinkedList<Mine>();

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

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

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

【讨论】:

    【解决方案2】:

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

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

    this.mines 引用显然等于null

    同时尝试让您的参考变量名称以小写字母开头。

    Continent Europe = new Continent("Europe");
    

    ->

    Continent europe = new Continent("Europe");
    

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

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

    【讨论】:

      【解决方案3】:

      是的,mine 可能不是null,但是mines 呢?我猜它是ArrayList&lt;Mine&gt; 或类似的东西,您是否将其初始化为mines = new ArrayList&lt;Mine&gt;()? (或任何集合)

      【讨论】:

        【解决方案4】:

        如果失败:

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

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

        private List<Mine> mines;
        

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

        或类似的东西。

        【讨论】:

        • 哦!谢谢 :D 它是受保护的 List 地雷,现在它可以工作了! :D
        • 最好使用private而不是protected,除非你真的需要使用protected。受保护的变量可以被子类访问,这可能会带来一些潜在的风险。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        相关资源
        最近更新 更多