java程序有时抛出空指针异常不是吗?为什么会这样?

java程序有时抛出空指针异常不是吗?为什么会这样?,java,multithreading,nullpointerexception,Java,Multithreading,Nullpointerexception,我写这个程序是为了同步多个线程,这个程序的功能是每个运行线程都会得到一些随机值,我们需要按顺序对它们进行排序,但是这个程序有时会得到空指针异常,有时不会。这是relayrace.java package com.mani.threadstrail; import java.util.Random; import java.util.LinkedList; import java.util.List; public class RelayRace extends Thread{ public

我写这个程序是为了同步多个线程,这个程序的功能是每个运行线程都会得到一些随机值,我们需要按顺序对它们进行排序,但是这个程序有时会得到空指针异常,有时不会。这是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);
}

}

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

这些是怎么进去的?你没有添加它们

嗯,列表a上的同步没有正确完成

在Runner中,add方法会对此进行同步。 但是,printlist在Runner.class上同步,因为它是一个静态方法。 排序根本不同步,即使它修改了列表。
例如,通过在Runner.class上同步所有三个访问来使用适当的同步,您将在哪一行获得NPE?至少发布stacktrace