有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么调用类构造函数会冻结应用程序?

我正在开发一个Java游戏,到目前为止,它运行良好。我没有错误消息,甚至没有警告。调试器似乎认为一切都正常工作,因为它不会像出现问题时通常那样以蓝色突出显示任何代码行。为了找出问题发生的地方,我在调用构造函数之前,在构造函数的第一行、paintComponent方法和run方法中添加了print语句。唯一正在打印的是调用构造函数之前的一行,因此不知何故调用了构造函数,但构造函数的第一行从未被读取,游戏循环甚至没有运行。通常我会包括一个SSCCE,但我一点也不知道问题出在哪里。在我开始删除我的部分代码直到某些东西起作用之前,是否有任何特定的原因可能是罪魁祸首?在调用构造函数和构造函数代码本身之间,什么可以阻止代码


共 (2) 个答案

  1. # 1 楼答案

    我发现这是一个递归函数。我已在游戏类中将此代码添加为字段:

    public class Game extends JPanel {
        ////THIS WAS THE PROBLEM
        public static Movement a = new Movement(5, 5);
        ////
        Game () {}
    
    }
    

    运动类中的代码:

    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;
        }
    }
    

    因为每一个动作都有一个动作,而这个动作又有一个动作,所以它甚至从未到达游戏构造器的第一行。谢谢大家的帮助

  2. # 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和调用的方法以及线程的状态,以获得冻结的清晰图像