java为什么调用类构造函数会冻结应用程序?
我正在开发一个Java游戏,到目前为止,它运行良好。我没有错误消息,甚至没有警告。调试器似乎认为一切都正常工作,因为它不会像出现问题时通常那样以蓝色突出显示任何代码行。为了找出问题发生的地方,我在调用构造函数之前,在构造函数的第一行、paintComponent方法和run方法中添加了print语句。唯一正在打印的是调用构造函数之前的一行,因此不知何故调用了构造函数,但构造函数的第一行从未被读取,游戏循环甚至没有运行。通常我会包括一个SSCCE,但我一点也不知道问题出在哪里。在我开始删除我的部分代码直到某些东西起作用之前,是否有任何特定的原因可能是罪魁祸首?在调用构造函数和构造函数代码本身之间,什么可以阻止代码
# 1 楼答案
我发现这是一个递归函数。我已在游戏类中将此代码添加为字段:
运动类中的代码:
因为每一个动作都有一个动作,而这个动作又有一个动作,所以它甚至从未到达游戏构造器的第一行。谢谢大家的帮助
# 2 楼答案
如果VM进程似乎正在循环,第一步是尝试获取线程转储。如果可以获得线程转储,通常可以清楚地知道哪个线程正在循环。如果可以识别循环线程,那么线程转储中的跟踪堆栈可以提供线程循环的位置(可能还有原因)的方向
如果应用程序控制台(标准输入/输出)可用,则按Ctrl-\key组合键(在Solaris OS或Linux上)或Ctrl-Break组合键(在Windows上)可使HotSpot VM打印线程转储,包括线程状态。在Solaris OS和Linux上,还可以通过向进程发送SIGQUIT(kill-QUIT命令)来获得线程转储。在这种情况下,线程转储被打印到目标进程的标准输出。根据进程的启动方式,输出可能被定向到文件
有关ThreadDump的信息
如果您使用的是IBM JDK,请添加以下JVM参数 -Xdump:java:events:user unix系统使用Kill-3PID,windows系统使用Ctrl+break
检查Threaddump和调用的方法以及线程的状态,以获得冻结的清晰图像