7

GUI で例外を管理する方法がわかりません。私の目標は、わかりやすいメッセージを表示して、何か問題が発生した場合にユーザーに知らせることです。

私はこのようなことを考えています:

// I'm inside an actionPerformed() method
try {
    // do whatever I have to do here
} catch (KnownBusinessException1 e) {
    // inform the user and do something;
    // most times simply inform the user that it wasn't possible to complete the
    // operation and remain in the same window instead of moving forward.
} catch (KnownBusinessException2 e) {
    // just as above
} catch (KnownDataAccessException1 e) {
    // just as above
} catch (KnownDataAccessException2 e) {
    // just as above
} catch (RuntimeException e) { // I want to catch any other unexpected exception,
// maybe NPE or unchecked IllegalArgumentExceptions and so on
    // something went wrong, I don't know where nor how but I will surely inform the user
}

現在: try ブロックにキャッチするチェック例外がある場合、try/catch をネストするか、RuntimeException をキャッチした後にこれらのチェック例外をキャッチする方がよいでしょうか? (それはおそらく依存します。ところで、これが起こるかどうかさえわかりません)

別のこと:Errorsはどうですか?もし私がユーザーだったら、予期せぬシャットダウンを経験したくはありません。むしろ、何かが信じられないほどうまくいかず、誰もそれについて何もできないことをアプリケーションが教えてくれることを望みます。「世界の終わりが来ているので、私は今すぐ終了します。」少なくとも私はそれが私のせいではないことを知っているだろう笑。

ところで、エラーをキャッチするのが良い方法かどうかはわかりません... :\

Swing アプリケーションでこれを行うより良い方法はありますか?

4

3 に答える 3

11

チェックされたすべての例外を明示的にキャッチし、残りのためにキャッチされていない例外ハンドラーをインストールするのが最善だと思います。これを参照してください: Java で例外がグローバルにスローされたことを検出するにはどうすればよいですか?

これは私が Thread.setDefaultUncaughtExceptionHandler を使用する方法です:

public static void setupGlobalExceptionHandling() {
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            handleException(e);
        }
    });
}

多くの SO 投稿で言及されている EDT スレッドの「sun.awt.exception.handler」トリックは不要であり、Java 7 では機能しないことに注意してください。Java 7 では、上記のように標準の Thread.setDefaultUncaughtExceptionHandler を使用するだけです。もちろん、両方のメカニズムを使用して例外ハンドラーを登録すると、コードはすべてのバージョンで機能します。

ところで、キャッチされていない例外がスローされた場合、EDT スレッドは自動的に再起動されます (ただし、アプリは一貫性のない状態のままになる可能性があります)。これを参照してください: EDT とランタイム例外

于 2012-09-09T18:21:13.263 に答える
0

try ブロックにキャッチするチェック例外がある場合、try/catch をネストするか、RuntimeException をキャッチした後にこれらのチェック例外をキャッチする方がよいでしょうか? (それはおそらく依存します。ところで、これが起こるかどうかさえわかりません)

あなたが言ったように、例外がキャッチされた後、try ブロック内の残りのコードを実行することが理にかなっているのかどうかによって異なります。そうでない場合は、try/catch ブロックをネストしても意味がありません。

于 2012-09-09T18:14:03.373 に答える
0

何か問題が発生したことをユーザーに示す良い方法は、JOptionPanes を使用することです。アイコン (情報/エラー) の適切な使用法に加えて、準備完了です。参照用のサンプル コードを次に示します。

http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

必要に応じて、いくつかのカスタマイズ/抽象化クラスを検討できJOptionPaneます:)

同じ方法で複数の例外を処理する場合、メッセージが 3 つKnownBusinessExceptionの s とKnownDataAccessExceptions のすべてで同じになる場合は、両方のクラスの親子関係が同じであることを確認し、その 1 つのクラスをキャッチできます。KnownBusinessExceptions ではなくKnownDataAccessExceptions に同じ処理が必要な場合は、すべてKnownBusinessExceptionの s を同じ親に、すべてKnownDataAccessExceptionの s を同じ親にします。

于 2012-09-09T18:16:23.437 に答える