【问题标题】:NullPointerException in array.length Javaarray.length Java 中的 NullPointerException
【发布时间】:2016-05-01 00:00:12
【问题描述】:

每当我尝试访问我的阵列时,我都会收到 NPE。即使调用 .length 属性也会给我一个 NPE。任何帮助,将不胜感激。这是我的构造函数和一直失败的方法。

public SkierList() {
    Skier[] skiers= new Skier[INITIAL_CAP];
    for (int i = 0; i < skiers.length; i++){
        skiers[i] = new Skier("");
    }
    int count = 0;
    
}

public void add(Skier newSkier) {   
    if (this.size() < skiers.length)
    {
        skiers[count] = new Skier(newSkier.getName(), newSkier.getLevel());
        count++;
    }
}

代码编译但在skiers.length处抛出NPE

【问题讨论】:

  • 为什么将 Skier 定义为数组和对象?没有意义
  • 你应该将你的数组定义为一个全局数组,并确保你没有在你的数组之后命名对象
  • 查找变量阴影,因为这正是您正在做的。您可能已经获得了一个未向我们展示的滑雪者字段(否则代码将无法编译),但您通过在构造函数中重新声明它来隐藏它。不要那样做。

标签: java arrays nullpointerexception


【解决方案1】:

全局定义滑雪者:

public Skier[] skiers= new Skier[INITIAL_CAP];

【讨论】:

  • 他已经在全局范围内定义了skier,否则代码将无法编译。但是他没有在类范围内初始化变量,因为他隐藏了变量。
  • 但他在 SkierList() 中有它
  • 是的,他这样做了,但如果他没有在类中声明(但没有初始化),代码将无法编译。
【解决方案2】:

您必须通过在构造函数中重新声明变量来隐藏变量。不要这样做,因为它会使字段为空。所以不是这个:

public class SkierList() {
    private Skier[] skiers; // this remains null

    public SkierList() {
        // you're re-declaring the skiers variable here
        // so only this local variable is non-null
        Skier[] skiers= new Skier[INITIAL_CAP];

        // ....
    }
}

而是

public class SkierList() {
    private Skier[] skiers; 

    public SkierList() {
        // Skier[] skiers= new Skier[INITIAL_CAP]; // Don't do this
        skiers = new Skier[INITIAL_CAP];  // note the difference
    }
}

public class SkierList() {
    private Skier[] skiers = new Skier[INITIAL_CAP];

    public SkierList() {
        // Skier[] skiers= new Skier[INITIAL_CAP];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2012-05-02
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多