java - 为什么我会收到 NullPointerException?

标签 java arrays nullpointerexception

我正在编写的程序遇到问题,但我不知道问题出在哪里。我做了几个较小的测试类来尝试找出问题所在,但我不明白。我确信这是关于数组如何工作的一些基本知识,但我似乎不记得是什么了。所以我在这里发布类(class)并希望你们知道出了什么问题。谢谢!

public class Main {

    public static void main(String[] args) {
        TestArray t = new TestArray(8);
        t.set(1, 15);
        t.print();
    }

}


public class TestArray {
    private Word[] a;

    public TestArray(int i){
        a = new Word[i];
    }

    public void set(int pos, long value){
        a[pos].set(value);
    }

    public void print(){
        for(Word w : a){
            System.out.println(w);
        }
    }
}



public class Word {
    private long value;

    public Word(long value){
        this.value = value;
    }

    public void set(long value){
        this.value = value;
    }

    public String toString(){
        return String.valueOf(value);
    }
}

当我尝试执行 t.set(1,15) 时,会发生错误,并且 Eclipse 表示该行有问题:a[pos].set(value);

最佳答案

您没有初始化 Word[] a 变量的实际元素。如果它们在 TestArray.set 方法中为 null,则初始化它们。

if (a[pos] == null)
    a[pos] = new Word(value);
else 
    a[pos].set(value);

Java 中对象数组的值被初始化为 null,这与原始数组的初始化方式(全零或等效值)相反。因此,当您通过 new Word[i] 创建数组时,您实际上是在创建一个 null 元素数组,并且必须相应地设置它们。

在 set 方法中执行此操作可确保您不会创建任何未使用的 Word 对象。这称为lazy initialization 。另一种方法是将它们全部初始化为构造函数中的某个默认值:

public TestArray(int i){
    a = new Word[i];
    for (int index = 0; index < i; index++) {
        a[index] = new Word(0); // Or some other default besides 0, like -1
    }
}

根据您的评论:

This seems to be the best way but I actually tried to do: (for-each code). Before asking here and that does not work. Why?

您的代码:

public TestArray(int i) {
    a = new Word[i];
    for(Word w:a) {
        w = new Word(0);
    }
}

不起作用,因为 w 不是像 a[index] 那样的实际引用。在数组的 for-each 循环中,您的代码实际上在编译时执行此操作:

for (int $i = 0; $i < a.length; $i++) { 
    Word w = a[$i];
    w = new Word(0);
}

如您所见,您正在将值分配给局部变量 w,而不是分配给 a 中的实际元素,因此该数组不会被改变了。备注:不要被 $ 变量迷惑,因为 1) $ 在 Java 变量名中是合法的(尽管你永远不应该显式使用它们)和 2) Java在编译代码时生成这些变量(可以在适当的调试器中看到)。

关于java - 为什么我会收到 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12591804/

相关文章:

java - 为特定键分配和取消分配数字

php - MySQL/PHP 批量删除使用数组 : Best method?

javascript - 如何获取与变量匹配的数组元素?

java.lang.NullPointerException : Attempt to invoke virtual method 'ActionBar.setNavigationMode(int)' on a null object reference 异常

java - Maven GAE/Datanucleus 不确定性

java - 如何更改 JButton 属性?

java - 使用 C、C++ 或 Java 以编程方式获取 Java 和 Flash 的版本号

arrays - 在 Excel 中输出数组

java - 什么是NullPointerException,我该如何解决?

java - 按日期对 RecyclerView 进行排序