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

上記のコードは、これら 2 つの基本クラスだけで完全に機能します。実際にはそれほど多くのことを行っていないため、これは予想されます。

私は...するだろう:

  1. IDE でクリーン ビルドを実行します (mvn clean、Eclipse->(Menu)->Clean など)。
  2. init() に到達したかどうかを確認するためにトレースします (あなたが言ったことにもかかわらず、私はとにかくそれを提案しています)。
  3. static { } 他のクラスに「コンストラクター」メソッドがないことを確認してください。
于 2012-08-10T03:51:56.883 に答える
0

他の人がすでに暗示しているように、クラスInternalPanelが以前に使用されていない場合、クラスInternalPanelがClassLoaderを介してロードされるということです。そのクラスは他のクラスに依存している可能性があり、それらはロードされる可能性があり、必要なすべてのクラスがロードされるまで再帰します。

読み込まれたすべてのクラスに対して、静的初期化子が呼び出されます。これらの静的イニシャライザの 1 つで、何らかのロックが発生し、アプリケーションがハングする可能性があります。

クラスのロードに問題がある可能性があるかどうかを確認するために、クラスのロード ブレークポイントを設定してみてください。

于 2012-08-10T04:08:35.337 に答える