我有一个我正在处理的应用程序决定停止以一种非常无法解释的方式工作。经过一些调试和错误跟踪后,我发现问题出在我的代码中对特定方法的调用中。
public static void main(String[] args) throws FileNotFoundException {
System.out.println("Print ");
InternalPanel.init();
}
IN INTERNAL PANEL
public static void init() {
System.out.println("Line");
}
只是为了澄清,从其他类调用任何其他方法是有效的。从此特定类调用任何方法不起作用。
此外,这个类(以及其中的方法)始终有效。
当它停止工作时,我对程序中完全不相关的东西进行了微小的更改(如在单独的线程中,对所讨论的类没有影响)
答案 0 :(得分:2)
尝试查看InternalPanel类的其余部分。静态初始化中的某些东西可能会对其他东西产生影响。例如:
public class InternalPanel
{
private static SomeOtherThing thing = new SomeOtherThing();
...
}
在上面的代码中,如果实例化SomeOtherThing最终会导致最终产生无限循环或堆栈溢出的事件链,那么会产生您所看到的效果。它实际上不是对init
函数的调用,而是对InternalPanel类的静态初始化。
(您可以通过让测试程序在InternalPanel
类上调用其他一些虚拟方法来轻松检查这是否是静态初始化问题。)
在调试模式下,您可能只想尝试在程序看起来被冻结时随机暂停执行,并查看正在运行的代码以及堆栈跟踪的样子。
答案 1 :(得分:0)
上面的代码只适用于这两个基类。这是预期的,因为它并没有真正做到那么多。
我会:
static { }
'构造函数'方法。答案 2 :(得分:0)
正如其他人所暗示的那样: 如果之前没有使用类ContentPanel,则会通过ClassLoader加载类。该类可能依赖于其他类,这些类可能会被加载并递归,直到加载所有必需的类。
对于所有已加载的类,将调用静态初始值设定项。在其中一个静态初始化程序中,可能会发生某种锁定,导致应用程序挂起。
尝试设置class load breakpoint以查看,如果加载课程可能是问题。