Java NullPointerException / 类型泛型问题

Java NullPointerException / Type Generics Question

我在 Java 中从头开始创建了一个链表 class。目标是让这个链表 class 成为 不可变的 。我正在使用泛型类型(疑似问题的一部分)。 class 具有三个属性:

boolean isEmpty;
T data;
LinkedListClass<T> next;

创建这个class还有两个构造函数,一个是私有的,另一个public:

private LinkedListClass(boolean isEmpty, T data, LinkedListClass<T> next){

    this.isEmpty = isEmpty;
    this.data = data;
    this.next = next;

}

...

public LinkedListClass(){

        LinkedListClass<T> newList = new LinkedListClass<T>(true, null, null);

    }

这是因为用户无法直接访问变量 isEmptydata下一个。因此,当用户创建一个链表时,上述变量被分配给 truenullnull分别默认。 N.b。任何以不再为空的方式附加或更改列表的方法都会因此将 isEmpty 值更改为 false.

我做了一个copyList()函数:

 public LinkedListClass<T> copyList() {

    LinkedListClass<T> clonedList = new LinkedListClass<T>();

    if(this.isEmpty) {

        return clonedList;
    }

    clonedList = new LinkedListClass<T>(false, this.data, this.next.copyList() ); //this is line 32


    return clonedList;


}

main 方法中,我只是像这样调用复制函数:

public class prog7 {

public static void main (String args[]) {

    LinkedListClass<Integer> list1 = new LinkedListClass();
    LinkedListClass<Integer> list2 = new LinkedListClass();
    list2 = list1.copyList();                                 //this is line 7

}

}

编译时出现如下错误:

Exception in thread "main" java.lang.NullPointerException
at LinkedListClass.copyList(LinkedListClass.java:32)
at prog7.main(prog7.java:7)

我认为 NullPointerException 被抛出是因为在创建 LinkedListClass<T> 时,它的两个值是 null。因此,当尝试更改它们或引用它们时,会抛出异常。我考虑过的一种解决方法是用 int 值 0 替换 public LinkedListClass<T> 构造函数中的 null。但是我的 IDE 抱怨预期的类型是 T,但我为它提供了 int。所以我认为这可能是关于类型泛型的问题。

您的 public 构造函数有问题。它应该是这样的:

public LinkedListClass() {
     this(true, null, null);
}

这一行

LinkedListClass<T> newList = new LinkedListClass<T>(true, null, null);

根本不设置参数,你创建了一个新的变量,以后不会用到。所以 isEmpty 有一个默认值 (false)。阅读有关构造函数重载的更多信息。