gpt4 book ai didi

java - NullPointerException 从构造函数启动时

转载 作者:行者123 更新时间:2023-12-01 21:24:44 25 4
gpt4 key购买 nike

当我尝试从 main() 启动线程时,程序正在运行,没有任何错误,但为什么当我尝试从构造函数启动线程时,我收到 NullponterException。

class MyThread extends Thread
{

static MyThread obj;
MyThread()
{
obj.start();
for(int i=1;i<20;i++)
System.out.println("getName:"+obj.currentThread().getName());
}

public void run()
{
for(int i=1;i<20;i++)
System.out.println("getName:"+obj.currentThread().getName());
}


public static void main(String... s)
{
obj=new MyThread();

}
}

最佳答案

问题在于您的代码以错误的顺序执行操作。当你说

obj = new MyThread();

代码执行以下操作:

  1. 创建一个新的MyThread对象。创建新对象包括执行构造函数。 new MyThread() 的值将是对新对象的引用。
  2. 将此引用分配给 obj

这不起作用,因为步骤 1 会在步骤 2 中获取值之前尝试使用 obj

解决方案(我认为)是认识到,当您在构造函数中时,this 是对正在创建的对象的引用。由于这似乎就是您想要的 obj ,因此您可以通过替换来运行您的程序

obj.start();

this.start();

或者,同等地,只是

start();

我尝试过这个,似乎有效。但是,我建议在实际程序中这样做。在线程对象的构造函数完成之前启动线程对象让我觉得很危险。 (如果在 start() 调用之后,构造函数的其余部分抛出异常,会发生什么?我必须查找它以找出确切的语义,但这意味着您正在运行一个其构造从未完成运行的线程。如果线程的 run() 方法尝试访问直到稍后在构造函数中才设置的实例变量怎么办?)如果您认为您想要这样的东西,那么很可能你需要重新考虑你的设计。然而,解决这个问题的一个简单方法是提供一个调用私有(private)构造函数的静态工厂方法(它有其他优点),然后在新的构造函数上调用 start()对象[其构造已成功完成],然后start()之后执行您想要执行的任何其他操作。

[P.S.我说“我认为”这是正确的解决方案,因为尚不完全清楚您要实现的目标。]

关于java - NullPointerException 从构造函数启动时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38341746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com