为什么c对象在run方法中为null?

时间:2015-08-29 04:04:14

标签: java multithreading nullpointerexception

我正在解决下面的面试问题。它抛出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}}

2 个答案:

答案 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个选择:

  1. 保持代码原样。有点模糊,但有效
  2. 在构造函数中执行。
  3. 在声明c时执行此操作。 最简单
  4. 选项2:构造函数

    c

    选项3:声明

    private JavaInterviewHub() {
        this.c = new Chicks();
    }
    

答案 1 :(得分:1)

创建这样的线程时:

new Thread(new JavaInterviewHub()).start();

创建了JavaInterviewHub的新实例。在这种情况下,c未在任何位置设置,因此在执行run方法时,会抛出NullPointerException

解决此问题的一种方法是在c的构造函数中初始化JavaInterviewHub。另一种方法是初始化c声明的地方。有关详细信息,请参阅有关的答案。