2

私は Java で、ヘルプ デスクの仕事としてデータをフォームに入力できるようにするプログラムを書いています。次に、送信されたフォームを使用して helpRequest オブジェクトが作成されます。このオブジェクトは、バイナリ ファイルに格納するための一般的なキューに入力されます。ただし、プロジェクト (これは学校の課題です) の責任は、例外を使用してプログラムをフェイルソフトにすることです。プログラムの特定の規定の 1 つは、「正常に」終了する前に、現在の helpRequest キューを保存しようとすることによって、続行できない状況を処理する必要があるということです。このすべてをコードで設定しましたが、ハンドラーが実行されると (私のテストではゼロ除算によって)、プログラムが helpQueue で何かをしようとするとすぐにハングします。

Java グローバル変数とグローバル例外ハンドラーを検索しようとしましたが、別のクラスまたはスロー クラスから構造体または変数を使用するというトピックに対処するものは何もないようです。

ハンドラーのコードは次のとおりです。スローするクラス HelpDeskForm で helpQueue を public および static として宣言しました。NetBeans はここにあるすべてのコードを受け入れます。誘発された例外は、キューが処理された後に発生します。

public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler {

    BinaryOutputFile emergencyOutput;

    public void uncaughtException(Thread t, Throwable e) {
        Frame f = new Frame();
        JOptionPane.showMessageDialog(f, "Program error.  Please select a file for queue output.");
        emergencyOutput = new BinaryOutputFile();
        while(!HelpDeskForm.helpQueue.isEmpty())
            emergencyOutput.writeObject(HelpDeskForm.helpQueue.remove());
        emergencyOutput.close();        
        System.exit(1);
    }

}

私の問題に対する特定の解決策ではなく、この例外ハンドラーで helpQueue が実際に表示されていない/使用できないように見える理由、または私がひどく間違っていることを誰かが説明していただければ幸いです。

編集: 説明を複雑にしすぎたくはありませんでしたが、ゼロ除算の例外までの HelpDeskForm コードを次に示します。

public class HelpDeskForm {

    BinaryDataFile input;
    BinaryOutputFile output; 
    CheckedForm c;
    helpRequest r;
    public static Queue<helpRequest> helpQueue;
    int inputSize;

    public HelpDeskForm() {

        GlobalExceptionHandler h = new GlobalExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(h);

        input = new BinaryDataFile();
        inputSize = input.readInt();
        for(int i = 0; i < inputSize; i++) {
            helpQueue.add((helpRequest)input.readObject());
        }
        input.close();

        int y = 0;
        int z = 2;
        z = z/y;
        ... // GUI code follows 
    }
}    
4

1 に答える 1