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);
}
这是因为用户无法直接访问变量 isEmpty、data 和 下一个。因此,当用户创建一个链表时,上述变量被分配给 true、null 和 null分别默认。 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
)。阅读有关构造函数重载的更多信息。
我在 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);
}
这是因为用户无法直接访问变量 isEmpty、data 和 下一个。因此,当用户创建一个链表时,上述变量被分配给 true、null 和 null分别默认。 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
)。阅读有关构造函数重载的更多信息。