2011-12-08 17 views
4

私のメソッドthrows節で例外を宣言して呼び出し側チェーンの上に例外を渡すことが何を意味するのか、そしてなぜそれをやりたいのかについての説明が望まれました。呼び出し側チェーンの例外を渡す

ここに、自分の例外をスローすることを理解した例があります。

public class ExceptionThrow { 
    char[] charArray = new char[] { 'c', 'e', 'a', 'd' }; 

    void checkArray() throws ABException { 
     for (int i = 0; i < charArray.length; i++) { 
      switch (charArray[i]) { 
      case 'a': 
       throw new ABException(); 
      case 'b': 
       throw new ABException();// creating the instance of the 
             // exception anticipated 
      default: 
       System.out.println(charArray[i] + " is not A or a B"); 

      } 
     } 
    } 

    public static void main(String[] args) { 
     ExceptionThrow et = new ExceptionThrow(); 

     try { 
      et.checkArray(); 
     } catch (ABException ab) { 
      System.out.println(ab.getMessage() + " An exception did actually occur"); 
     } finally { 
      System.out.println("This block will always execute"); 
     } 

    } 
} 

class ABException extends Exception { 
} 

「コールチェーンの上に」例外をどのように渡しますか?

よろしく アリウス

答えて

21

"スタックトレース "とも呼ばれる"呼び出しチェーン "は、1行の実行につながるすべてのネストされたメソッド呼び出しのリストです。あなたのケースでは、その深さは2:mainとなりますが、checkArrayと呼ばれますが、数多くの方法があります。

コード内で例外が発生すると、現在のメソッドが中断され、スタックトレース上の以前のメソッドに制御が戻されます。このメソッドが例外を処理できる場合(catch)、catchが実行されますが、例外はバブリングを停止します。そうでない場合、例外はスタックトレースをバブルアップします。最終的に、mainに到着し、mainがそれを処理できない場合、プログラムはエラーで停止します。

特定のケースでは、throw new ABException()checkArrayメソッドを中断するABExceptionを作成してスローします。例外はあなたのメインでcatch(ABException ab)と捕らえられます。したがって、あなたの質問によると、このコードは例外を '呼び出し元のチェーンの上に渡す'と言うことができます。

特に、チェック/チェックされていない例外に関連する言い方がたくさんあります。より具体的な質問がある場合は、お気軽にお問い合わせください。

+2

+1明確な説明があります。追加する小さなものが1つあります。例外のスタックトレースを見たい場合は、 'printStackTrace()'メソッドを呼び出すことができます。 'try {...} catch(例外e){e.printStackTrace();} } ' – THelper

+0

THELPER、あなたが間違っていると言っているのではありませんが、これらの(例外をバブリングする)状況でe.printStackTrace()を使うのは悪い習慣だと思います。テストやもののためにそれを使用するのは大丈夫です。これは、不要なスタックトレースをログファイルに残すためです。特に、例外が上位層で処理されている場合、現在のコンテキストでは意味を持たないスタックトレースでログを汚染するのはなぜですか。 – Amit

1

あなたはmain()でそれをキャッチするが、main()と呼ばれるロジックの部分にそれを渡していないことにより、例えばそれを行うことができます。 main()はあなたのプログラムのエントリポイントであるとして、この場合、それはあなたも今では、呼び出しまでcheck()から例外を渡す方法checkArray()」より明確になり、あなたの方法

void checkArray() throws ABException { 
    for (int i = 0; i < charArray.length; i++) { 
     check(charArray[i]); 
    } 
} 

void check(char c) throws ABException { 
    switch (c) { 
     case 'a': 
      throw new ABException(); 
     case 'b': 
      throw new ABException();// creating the instance of the 
            // exception anticipated 
     default: 
      System.out.println(c + " is not A or a B"); 
    } 
} 

を書き換える可能性が...、

些細ですchain "

+0

をログインした後、それを再スローする必要がありますスタックトレース全体をワイヤーに渡したいが、関連情報をバブルアップしたいのですか? – user1071840

+0

@ user1071840:おそらく、別の質問でこれを尋ねてください... –

4

まず、あなたはmain方法にthrows ABExceptionを追加し、いずれかの例外をキャッチブロックを削除するか、これは複数のコンポーネントと我々ドンとシステムとは何かあれば

throw ab; 
関連する問題