-5

本体で何らかの例外をスローする method() を考えてみましょう。次のシナリオを検討してください:
シナリオ 1:

{
  //..
  // ..
  method();    //Exception handled inside the method
  //..
  //..
}

この場合、例外は method() 自体の中で処理する必要があります。

これも考慮してください:
シナリオ 2:

{
   //..
   //..
   try{
      method();   //Exception not handled with-in the method
      }
    catch(){}
   //..
   // ..
}

シナリオ 2 のような状況が許可されないのはなぜですか? つまり、例外をメソッド内で処理する必要があるのはなぜですか?

4

6 に答える 6

2

状況 2throwsで説明したように、メソッドに句を追加してexception、処理可能な をスローさせることができます。したがって、次のように許可されます:-

void method() throws Exception{
}
于 2013-02-28T11:20:50.947 に答える
1

両方のシナリオが許可されます。Javaが課す制限(それが正しい用語である場合)は、例外をどこかで処理する必要があるということです。

最初のシナリオでは、呼び出されたメソッドが例外自体を処理するため、呼び出し元のメソッドでtry-catchを実行する必要はありません。

2番目のシナリオは有効ですが、例外を別の場所で処理する必要があることを示す宣言がmethod()含まれている場合に限ります。throws

void method() throws Exception
{
}
于 2013-02-28T11:26:03.853 に答える
1

許可されています!次のように使用します

public void method() throws ClassNotFoundException {

ClassNotFoundException をキャッチします。Exception(ほとんどの場合、単純化された他のポスターのように、裸を投げるべきではありません)

内外でチャットするかどうかは、ソフトウェアの設計です。経験則はありません。私の経験では、外部をキャッチすると、コードがより単純になり、単体テストがより適切になる可能性があります。

設計パターンの「最後の防御線」を探します。つまり、最上位のクラス、たとえば main() に catch (Exception ex) {

他のメソッドがそれをキャッチしなかったときにキャッチします。その場合、例外をログに記録し、システムを安全にシャットダウンする (試行する) ことができます。これが最後の防衛線です。注: spmetimes にも意味がありますcatch(Throweable th)

于 2013-02-28T11:29:21.580 に答える
0

TL; DR:本当に意図しない限り、InterruptedExceptionをトラップしないでください。ほとんどの場合、スローする必要があります。

この素晴らしい質問は、実際には非常に重要な設計上の決定です。これを正しく行うことは困難であり、チーム全体でこれを正しく行うことはさらに困難です。質問への答えはあなたの実装の中にあります。エラーをすぐにユーザーに表示する必要がありますか?障害から回復するための補助的な方法はありますか?例外は致命的なイベントですか?

空の例外ハンドラーを作成しないでください。問題が発生したときに、log.debugステートメントをそこに入れておくと非常に満足できます。それ以外:すべての例外が何を意味するかを学び、可能な限り最も優雅な方法でそれに対応します。

于 2013-02-28T11:25:58.553 に答える
0

上で述べたように、アイデアは早く投げて遅くキャッチすることです。全体として、ロジックを「フロー」にするだけで、スローする例外を最小限に抑える必要があります。しかし、扱いにくい、またはコードを難読化しすぎる状況が常に存在するため、ユーザーが特定のメソッドを使用するリスクを理解し、それに応じてそれらを処理することを確認する価値があります。

于 2013-02-28T11:23:04.830 に答える
0

senario-2 を使用して例外を処理する場合、例外を実際の例外にマップすることはできません。つまり、ブロック内のコードに従って記述することはできません。そのため、例外が発生した理由を具体的に説明できるように、スポット自体に例外を処理してください。

于 2013-02-28T11:21:53.633 に答える