java程序有时会抛出nullpointer异常吗?为什么会这样?

时间:2017-07-24 10:36:55

标签: java multithreading nullpointerexception

我编写了这个程序来同步多个线程,这个prog的功能是每个跑步者线程得到一些随机值,我们需要按顺序对它们进行排序,但是有时候prog会得到空指针异常。这是relayrace.java

package com.mani.threadstrail;
import java.util.Random;

import java.util.LinkedList;
import java.util.List;

public class RelayRace extends Thread{

public static void main(String[] args) {
    // TODO Auto-generated method stub

   for(int i=0;i<10;i++)
   {
       RelayRace r= new RelayRace();
       r.setName("runner-"+ i);
       r.start();
   }
  try {
    Thread.sleep(1000);
    Runner.sortings();
    Runner.printlist();

} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}


}

public void run() {
    Random rand = new Random();

    int  n = rand.nextInt(50) + 1;
    System.out.println(Thread.currentThread().getName()+"  "+ n);
    Runner r1 = new Runner(n,Thread.currentThread().getName());
    r1.add();
}

}

这是runner.java

package com.mani.threadstrail;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;


public class Runner implements Comparable<Runner> {

  static List<Runner> a = new LinkedList<Runner>();

  public int speed;
  public String name;
  Runner(int speed,String name){
      this.name=name;
      this.speed= speed;
  }
  public synchronized void add() {

      a.add(this);

  }
  static synchronized void printlist() {
      for(Runner st:a){  
          System.out.println(st.speed+" "+st.name);  
      }
  }
 static void sortings() {
     Collections.sort(a);
 }

@Override
public int compareTo(Runner o) {
    return -(this.speed-o.speed);
}

}

1 个答案:

答案 0 :(得分:2)

你得到一个NPE,因为当你尝试对它进行排序时,列表中有空元素。

这些如何进入?你不添加它们......

好了,列表a上的同步未正确完成。

  • Runner add()方法this同步printlist()
  • 然而,
  • Runner.class会在sortings()上同步,因为它是一种静态方法。
  • Runner.class根本不会同步,即使它确实修改了列表。

使用正确的同步(例如,通过同步NullPointerException上的所有三个连接),您将摆脱class a implements ItemListener s