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