为什么调用 class 构造函数会冻结应用程序?
Why the call to the class constructor freezes the application?
我正在开发 Java 游戏,目前为止运行良好。我没有错误消息,甚至没有警告。调试器似乎认为一切正常,因为它没有像通常出现问题时那样用蓝色突出显示任何代码行。因此,为了找出问题发生的位置,我在调用构造函数之前将 print 语句添加到构造函数的第一行、paintComponent 方法和 运行 方法中。唯一被打印的是调用构造函数之前的那个,所以构造函数被调用了,但是构造函数的第一行永远不会被读取,游戏循环甚至没有 运行宁。通常我会包括一个 SSCCE,但我一点也不知道问题出在哪里。在我开始删除部分代码直到一切正常之前,是否有任何特定的可能是罪魁祸首?是什么在构造函数调用和构造函数代码本身之间停止了代码?
好的,我发现这是一个递归函数。我在我的游戏中添加了这段代码作为一个字段 class:
public class Game extends JPanel {
////THIS WAS THE PROBLEM
public static Movement a = new Movement(5, 5);
////
Game () {}
}
运动中的这段代码class:
public class Movement {
int x, y;
////THIS TOO
Movement b = new Movement(0, 0);
////
Movement(int x, int y) {
this.x = x; this.y = y;
}
}
因为每个 Movement 都有一个 Movement,而 Movement 又有一个 Movement,所以它甚至没有到达游戏构造函数的第一行。谢谢大家的帮助!!
如果 VM 进程似乎在循环,第一步是尝试获取线程转储。如果可以获得线程转储,通常会很清楚哪个线程正在循环。如果可以识别循环线程,则线程转储中的跟踪堆栈可以提供有关线程循环位置(以及可能原因)的方向。
如果应用程序控制台(标准 input/output)可用,则按 Ctrl-\ 组合键(在 Solaris OS 或 Linux 上)或 Ctrl-Break 组合键(在 Windows)导致 HotSpot VM 打印线程转储,包括线程状态。在 Solaris OS 和 Linux 上,还可以通过向进程发送 SIGQUIT(命令 kill -QUIT)来获取线程转储。在这种情况下,线程转储被打印到目标进程的标准输出。输出可能会定向到文件,具体取决于进程的启动方式。
的信息
如果您使用的是 IBM JDK 添加以下 JVM 参数
-Xdump:java:事件:用户
unix 系统使用 Kill -3 pid,windows 系统使用 Ctrl+break。
检查 Threaddump 和您调用的方法以及线程的状态,以清楚地了解冻结情况。
我正在开发 Java 游戏,目前为止运行良好。我没有错误消息,甚至没有警告。调试器似乎认为一切正常,因为它没有像通常出现问题时那样用蓝色突出显示任何代码行。因此,为了找出问题发生的位置,我在调用构造函数之前将 print 语句添加到构造函数的第一行、paintComponent 方法和 运行 方法中。唯一被打印的是调用构造函数之前的那个,所以构造函数被调用了,但是构造函数的第一行永远不会被读取,游戏循环甚至没有 运行宁。通常我会包括一个 SSCCE,但我一点也不知道问题出在哪里。在我开始删除部分代码直到一切正常之前,是否有任何特定的可能是罪魁祸首?是什么在构造函数调用和构造函数代码本身之间停止了代码?
好的,我发现这是一个递归函数。我在我的游戏中添加了这段代码作为一个字段 class:
public class Game extends JPanel {
////THIS WAS THE PROBLEM
public static Movement a = new Movement(5, 5);
////
Game () {}
}
运动中的这段代码class:
public class Movement {
int x, y;
////THIS TOO
Movement b = new Movement(0, 0);
////
Movement(int x, int y) {
this.x = x; this.y = y;
}
}
因为每个 Movement 都有一个 Movement,而 Movement 又有一个 Movement,所以它甚至没有到达游戏构造函数的第一行。谢谢大家的帮助!!
如果 VM 进程似乎在循环,第一步是尝试获取线程转储。如果可以获得线程转储,通常会很清楚哪个线程正在循环。如果可以识别循环线程,则线程转储中的跟踪堆栈可以提供有关线程循环位置(以及可能原因)的方向。
如果应用程序控制台(标准 input/output)可用,则按 Ctrl-\ 组合键(在 Solaris OS 或 Linux 上)或 Ctrl-Break 组合键(在 Windows)导致 HotSpot VM 打印线程转储,包括线程状态。在 Solaris OS 和 Linux 上,还可以通过向进程发送 SIGQUIT(命令 kill -QUIT)来获取线程转储。在这种情况下,线程转储被打印到目标进程的标准输出。输出可能会定向到文件,具体取决于进程的启动方式。
的信息如果您使用的是 IBM JDK 添加以下 JVM 参数 -Xdump:java:事件:用户 unix 系统使用 Kill -3 pid,windows 系统使用 Ctrl+break。
检查 Threaddump 和您调用的方法以及线程的状态,以清楚地了解冻结情况。