【问题标题】:Java program freezes on call to any method of a particular classJava 程序在调用特定类的任何方法时冻结
【发布时间】:2012-08-07 08:56:35
【问题描述】:

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

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

澄清一下,从其他类调用任何其他方法是可行的。从这个特定的类调用任何方法都不起作用。

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

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

【问题讨论】:

  • 如果您恢复更改怎么办?
  • 这个特别无害的系统调用似乎不会导致挂起。使用功能强大的调试器审慎地检查您的代码,并查看程序调用的每一步发生了什么。
  • InternalPanel 是否有任何类型的静态初始化?如果是,请出示该代码。
  • 这个问题太模糊了。
  • InternalPanel 这是一个 Swing 程序吗?应该在 AWT 事件调度线程 (EDT) 上执行所有组件操作(使用 java.awt.EventQueue.invokeLater 和大量样板文件)。可变静态/全局状态也很糟糕。 / 其他线程在做什么? - 使用你的调试器,jstack,ctrl-\/ctrl-break,或类似的。

标签: java class methods static static-methods


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 太棒了。这解决了它不起作用的原因。非常感谢!
【解决方案2】:

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

我愿意:

  1. 在您的 IDE 中执行干净的构建(mvn clean、Eclipse->(Menu)->Clean 等)
  2. 跟踪(不管你说什么,我还是建议这样做)看看是否达到了 init()。
  3. 检查您在任何其他类中没有 static { } 'constructor' 方法。

【讨论】:

    【解决方案3】:

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

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

    尝试设置class load breakpoint 以查看是否加载类可能是问题。

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 1970-01-01
      • 2015-09-11
      • 2011-06-08
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多