我正在解决下面的面试问题。它抛出go()
,但我不明白c的值是如何为空。我已经在package swain.javainterviewhub.blogspot.in;
class Chicks{
synchronized void yack(long id){
for(int x=1;x<3;x++){
System.out.println(id+" ");
Thread.yield();
}
}
}
public class JavaInterviewHub implements Runnable {
Chicks c;
public static void main(String[] args) {
new JavaInterviewHub().go();
}
void go(){
c=new Chicks();
new Thread(new JavaInterviewHub()).start();
new Thread(new JavaInterviewHub()).start();
}
@Override
public void run() {
c.yack(Thread.currentThread().getId());
}
}
方法中初始化了它。
Exception in thread "Thread-0" Exception in thread "Thread-1" java.lang.NullPointerException
at swain.javainterviewhub.blogspot.in.JavaInterviewHub.run(JavaInterviewHub.java:28)
at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
at swain.javainterviewhub.blogspot.in.JavaInterviewHub.run(JavaInterviewHub.java:28)
at java.lang.Thread.run(Unknown Source)
控制台:
{{1}}
答案 0 :(得分:4)
由于Chicks.yack()
是synchronized
,您可能意味着两个线程都使用相同的Chicks
实例,这意味着您可能意味着两个线程都使用相同的{{1}实例1}},在这种情况下,您可能想要使用JavaInterviewHub
中创建的实例启动两个线程。
如果这一切都是真的,那么在创建线程时需要使用main()
:
this
至于何时创建void go(){
c=new Chicks();
new Thread(this).start();
new Thread(this).start();
}
的实例,并因此为Chicks
分配值,您有3个选择:
c
时执行此操作。 最简单 选项2:构造函数
c
选项3:声明
private JavaInterviewHub() {
this.c = new Chicks();
}
答案 1 :(得分:1)
创建这样的线程时:
new Thread(new JavaInterviewHub()).start();
创建了JavaInterviewHub
的新实例。在这种情况下,c
未在任何位置设置,因此在执行run
方法时,会抛出NullPointerException
。
解决此问题的一种方法是在c
的构造函数中初始化JavaInterviewHub
。另一种方法是初始化c
声明的地方。有关详细信息,请参阅有关的答案。