2012-08-10 36 views
1

我有一个应用程序,我正在处理这个应用程序,因此决定以非常无法解释的方式停止工作。经过一些调试和错误跟踪之后,我发现问题在于我的代码中调用特定的方法。Java程序在调用任何特定类的方法时会冻结

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

如果您恢复更改,该怎么办? – 2012-08-10 03:48:03

+0

这个特别无害的系统调用似乎不能导致挂起。用一个强大的调试器明智地浏览你的代码,看看程序调用的每一步都会发生什么。 – Makoto 2012-08-10 03:51:51

+2

'InternalPanel'是否有任何静态初始化?如果是这样,请显示该代码。 – 2012-08-10 03:52:12

回答

2

尝试查看其余的InternalPanel类。静态初始化中的某些东西可能会影响别的东西。例如:

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

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

(你可以很容易地检查,如果这是一个静态初始化问题具有测试程序调用上的InternalPanel类的一些其他假设法。)

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

+0

辉煌。这解决了它不工作的原因。非常感谢你! – 2012-08-10 03:56:29

0

上面的代码完全适用于我只有这两个基类。这是预料之中的,因为它并不是那么做。

我想:

  1. 在IDE中执行干净的构建(MVN清洁,日食 - >(菜单) - >清洁等)
  2. 跟踪(尽管你说的话,我建议它无论如何)看是否达到了init()。
  3. 检查在其他任何类中没有static { }“构造函数”方法。
0

正如其他人暗示的那样: 会发生什么情况是,类InternalPanel通过ClassLoader加载,如果以前没有使用过。该类可能依赖于其他类,这些类可能会被加载,并且在所有需要的类加载之前递归。

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

尝试设置class load breakpoint来查看,如果加载类可能是问题。

相关问题