1

我有一个我正在处理的应用程序决定以一种非常无法解释的方式停止工作。经过一些调试和错误跟踪,我发现问题出在我的代码中对特定方法的调用中。

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

只是为了澄清,从其他类调用任何其他方法都有效。从这个特定的类调用任何方法都不起作用。

此外,这个类(和其中的方法)一直有效。

当它停止工作时,我正在对程序中完全不相关的东西进行微小的更改(如在单独的线程中,对相关类没有影响)

4

3 回答 3

2

尝试查看 InternalPanel 类的其余部分。其静态初始化中的某些内容可能会对其他内容产生影响。例如:

public class InternalPanel
{
    private static SomeOtherThing thing = new SomeOtherThing();
    ...
}

在上面的代码中,如果实例化 SomeOtherThing 最终导致一连串事件最终产生无限循环或堆栈溢出,则会产生您所看到的效果。它实际上不是对init函数的调用,而是 InternalPanel 类的静态初始化。

(您可以通过让您的测试程序在类上调用其他一些虚拟方法来轻松检查这是否是静态初始化问题InternalPanel。)

在调试模式下,您可能只想尝试在程序似乎被冻结时随机暂停执行,并查看正在运行的代码以及堆栈跟踪的样子。

于 2012-08-10T03:54:11.223 回答
0

上面的代码对我来说非常适合这两个基类。这是意料之中的,因为它并没有真正做那么多。

我会:

  1. 在您的 IDE 中执行干净的构建(mvn clean、Eclipse->(Menu)->Clean 等)
  2. 跟踪(尽管您说了什么,我还是建议这样做)以查看是否达到了 init() 。
  3. 检查您在任何其他类中都没有static { } “构造函数”方法。
于 2012-08-10T03:51:56.883 回答
0

正如其他人已经暗示的那样:发生的情况是,InternalPanel 类通过 ClassLoader 加载,如果之前没有使用过的话。该类可能依赖于其他类,这些类可能会被加载并递归直到加载所有必需的类。

对于所有加载的类,都会调用静态初始化程序。在其中一个静态初始化程序中,可能会发生某种锁定,导致您的应用程序挂起。

尝试设置类加载断点以查看是否加载类可能是问题。

于 2012-08-10T04:08:35.337 回答