11

Eclipse で try/catch ブロックを追加すると、「try/multi-catch で囲む」または「try/catch で囲む」というオプションが表示されました。

これは try/multi-catch です:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException | IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

これは単一の try/catch です:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

どちらかを使用することの利点/影響は何ですか? 私が正しければ、最初の例では、例外のいずれかがスローされて同じ CATCH が生成されたときに catch ブロックが実行され、2 番目の例では、個別の catch ブロックを有効にしながら、例外に基づいて catch がスローされます。

これについて他に知っておくべきことはありますか?私は以前にそれらを使用したことがなく、使用する価値があるかどうかわかりません.

4

5 に答える 5

8

tl;dr Mutlicatch は単独で物事を処理しますが、複数の catch ブロックはより柔軟で操作に適しています。2 つの技術は組み合わせることができます。

さまざまな種類の例外をスローできる try ステートメントがある場合は、複数の catch ブロックが必要になります。もう少しコードが増えますが、はるかに優れた柔軟性を提供します。

たとえば、ソケットを操作している場合、SocketException は、再接続やエラー メッセージだけでキャッチされる場合があります (ケーブルが誤って切断されたなどの単純な原因で発生する可能性があります)。

ヌル ポインター例外 (チェックされていませんが) がキャッチされた場合は、ログに書き込み、ここに緊急着陸し、できることをクリーンアップし、コードごとにかなりバックトラックすることをお勧めします。

さらに、これはさらに細分化することができ、さまざまなタイプの「一般的な」例外によってさまざまなアクションが実行される可能性があります (接続が失われた場合と名前が解決されない場合など、最初の接続試行でエンドユーザーに異なる影響を与えるなど)。さまざまな「重い」例外もさまざまな方法で処理されます。

1 つの (複数の例外タイプの) catch ブロックを使用することもできますが、すべての例外に対して同様のアクションを単独で実行する (ケーブルが抜かれていることに基づく条件と同じ方法でユーザーにヌル ポインター例外を提示する) か、次のif e instanceof FooExceptionブロックを必要とするかのいずれかになります。可読性が低下する可能性があります。

また、この 2 つを組み合わせて、すべての「一般的な」例外をマルチキャッチして再試行と適切なメッセージにし、すべての重大な例外を強制的なクリーンアップとシャットダウンにすることもできます。

トリップしたケーブルのスタックトレースは必要なく、欠落しているオブジェクトを消し去りたくありません。

于 2013-07-14T00:54:37.297 に答える
2

これは選択の問題です。可読性、移植性、保守性のバランスを取り、さまざまな例外を異なる方法で処理する必要があります。

したがって、使用のバランスを取ってください...すべてのキャッチが同じ処理ブロックを使用する場合は、最初の形式を使用してください。コンパイラは、物事を少し最適化できます。

一方、各例外を異なる方法で処理する場合は、2 番目の形式を使用します。

これはやや大雑把な質問であり、答えは目標によって異なります。

于 2013-07-14T00:57:13.587 に答える
2

最初のコード スニペットは、JDK が Java JDK 7 の場合にのみ適用されると思います。

さまざまな種類の例外をスローできるコード行があり、それらすべてを同様の方法で処理したい場合、複数行のコードを節約できる Multicatch が適しています。

ただし、複数の例外をスローするコード行があり、それらの例外を個別に処理したい場合は、単一の catch 例外の方が適しています。

于 2013-07-14T00:57:17.463 に答える
1

すべての例外に対して同じことをしたい場合、try-multi catch と try-catch は同じですが、前者の方が短いです。すべてのプログラマーは怠け者です。

異なる例外に対して異なることをしたい場合:

} catch(AException e) {
    System.err.println("AException occured");
} catch(BException e) {
    System.err.println("BException occured");
}

トライマルチキャッチは、正しい選択ではありません。


} catch(AException | BException e) {
    System.err.println("A or B Exception occured");
}

eの型はと の最も近い共通のスーパータイプであるAExceptionことに注意してくださいBException

于 2013-07-14T01:05:01.667 に答える
0

ほら、try-catch 構造の実際の有用性は、特定のエラー処理関数を特定の例外に適用できることです。あなたの場合、スタック トレースを出力する以外に何もしたくないようです。たとえば、FileIOException がスローされた場合にウィンドウを閉じて、他の例外が発生した場合に単にエラー メッセージを表示したい場合、2 番目に書いたように、複数の try-catch ブロックがあると便利です。コードブロック。ただし、このアプリケーションでは、次のようなキャッチが必要な場合があります。

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
} catch (Exception e) {
    e.printStackTrace();
}

そして、それはすべての例外のストラック トレースを出力します。:)

于 2013-07-14T00:57:40.293 に答える