Java 为什么c对象在run方法中为null?
我正在解决下面的面试问题。它抛出了一个NullPointerException,但我不理解c的值是如何为null的。我已经在go方法中初始化了它Java 为什么c对象在run方法中为null?,java,multithreading,nullpointerexception,Java,Multithreading,Nullpointerexception,我正在解决下面的面试问题。它抛出了一个NullPointerException,但我不理解c的值是如何为null的。我已经在go方法中初始化了它 创建如下线程时: new Thread(new JavaInterviewHub()).start(); 创建了JavaInterviewHub的一个新实例。在这个实例中,c没有设置在任何地方,因此当执行run方法时,会抛出一个NullPointerException 解决这个问题的一种方法是在JavaInterviewHub的构造函数中初始化c。另
创建如下线程时:
new Thread(new JavaInterviewHub()).start();
创建了JavaInterviewHub的一个新实例。在这个实例中,c没有设置在任何地方,因此当执行run方法时,会抛出一个NullPointerException
解决这个问题的一种方法是在JavaInterviewHub的构造函数中初始化c。另一种方法是在声明的地方初始化c。有关更多信息,请参阅答案。由于Chicks.yack是同步的,您可能希望两个线程使用相同的Chicks实例,这意味着您可能希望两个线程使用相同的JavaInterviewHub实例,在这种情况下,您可能想用在main中创建的实例启动两个线程
如果这都是真的,那么在创建线程时需要使用:
void go(){
c=new Chicks();
new Thread(this).start();
new Thread(this).start();
}
至于何时创建Chicks实例并因此为c赋值的问题,您有3种选择:
保持代码不变。有点模糊,但有效。
在构造函数中执行此操作。
在声明c时执行此操作。最简单的。
选项2:构造函数
private JavaInterviewHub() {
this.c = new Chicks();
}
备选案文3:声明
private final Chicks c = new Chicks();
JavaInterviewHub的每个实例都有自己的c字段?new Threadnew JavaInterviewHub.start;-此处创建的JavaInterviewHub没有初始化其c字段。@immibis您能简要解释一下此处发生了什么吗?如果您这样做,那么您总共有3个JavaInterviewHub和Chicks实例,程序创建多个JavaInterviewHub实例的原因并不是因为它创建了这样的新线程。。。这是因为新的JavaInterviewHub。我知道这是你们所说的大部分,但这些新手需要很多的帮助。当你创建一个新的线程时,如果创建线程不是问题的话,不要说这会让他们感到困惑。
private JavaInterviewHub() {
this.c = new Chicks();
}
private final Chicks c = new Chicks();