我正在处理一个非常复杂的代码,我想在其中包含线程。为了更好地理解,我在玩一些线程,并得到了一个NullPointerException
,我不知道它为什么在其中:
这是我的主要方法以及使用的两个类:
public static void main (String args[]) {
listInteger list = new listInteger();
for(int i = 0; i < 10; i++) {
list.add(i);
}
printList printy = new printList(list);
Thread no1 = new Thread(printy);
Thread no2 = new Thread(printy);
no1.start();
no2.start();
}
public class printList implements Runnable {
public listInteger list;
public printList(listInteger list) {
this.list = list;
}
@Override
public void run() {
while(list.size() > 0) {
System.out.println(list.getFirst());
list.removeFirst();
}
}
}
public class listInteger {
public LinkedList<Integer> list;
public Integer getFirst() {
return list.getFirst();
}
public void removeFirst() {
list.removeFirst();
}
public int size() {
return list.size();
}
public void add(Integer e) {
list.add(e);
}
}
我认为它只会打印出数字。我想看看线程何时终止,并且还可以同步处理,以查看输出的差异。该列表应该向我显示线程在做什么,但我什至没有意识到这一点。什么时候指向null?我对.add()做错了吗? (我现在已经在实际代码上工作了许多小时。如果很明显,请原谅我,只是看不到。)
答案 0 :(得分:2)
问题出在您的listInteger类中。
public LinkedList<Integer> list;
永远不会初始化,因此每次与它的交互都将具有NullPointerException。 基本上可以解决您的问题。
public LinkedList<Integer> list = new LinkedList<>();
此外,您使用列表的方式也被打破。我建议您阅读一些有关Java中的并发性,有关Java内存模型的信息。
此外,这对您阅读有关Java命名约定的信息确实很有帮助。
答案 1 :(得分:0)
您从未初始化过您的
list
类中的listInteger
请更改
public LinkedList<Integer> list;
到
public LinkedList<Integer> list=new LinkedList<>();