打印IntegerList-NullPointerException(线程)

时间:2019-01-26 18:26:05

标签: java

我正在处理一个非常复杂的代码,我想在其中包含线程。为了更好地理解,我在玩一些线程,并得到了一个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()做错了吗? (我现在已经在实际代码上工作了许多小时。如果很明显,请原谅我,只是看不到。)

2 个答案:

答案 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<>();