2011-07-12 34 views
2

これはどのように動作するのでしょうか。私は例外をスローするメソッドを持っている場合、私はメソッドでそれを処理するか、またはメソッドが例外をスローすることを宣言します。メソッド内に例外をスローする可能性があるが、明示的に宣言されていないメソッドがあるとどうなりますか?例えばJava例外処理

public void A() throws Exception 
{ 
    B(); 
} 

public void B() 
{ 
    //Some code in here may cause an exception. 
} 

方法 "B" は、例外が発生したときにどうなりますか?プログラムはクラッシュしますか?メソッド宣言で "B"が "例外をスロー"する必要がありますか?

+4

試しましたか?テストして結果を知るには、わずか2分かかります。 –

+0

@ハリーはまずそれを試してみました。答えを読むのではなく、もっと理解してくれるでしょう。それ以降は、明確でない場合は質問を投稿してください。 – raksja

答えて

1

チェックサム例外と未チェック例外の両方があります。

未チェックの例外は、RuntimeExceptionのサブクラスです。メソッドのシグネチャで宣言する必要はなく、スローすることができます。それらが捕らえられなければ、スタックの上にさらに投げられます。 Bが未確認のExeption Aをスローすると、それもスローされます。コンパイラは、未チェックの例外が処理されているかどうかをチェックしません。実行時にのみ表示されるため、RuntimeExceptionという名前になります。

チェックされた例外はシグネチャで宣言する必要があり、処理する必要があります。または、呼び出し元メソッドのメソッドシグネチャには、例外がスローされたことを示す必要があります。さもなければ、コンパイラは文句を言うでしょうし、あなたはプログラムをコンパイルできません。したがって、BがFileNotFoundExceptionのようなCheckedExceptionをスローすると、Bのシグネチャでそれを宣言する必要があります。 Aはそれをキャッチしないので、それはさらにスローされます。例外をスローするためにAを宣言するとその場合は機能しますが、それは悪い習慣です。

3

メソッドBが検査済みの例外をスローしている場合は、throws exception文を宣言する必要があります。

0

例外が発生した場合は、最も近いcatchブロックにキャッチされます。現在の関数にキャッチが存在しない場合、それは関連するキャッチブロックが見つかるまでバブルアップします。

関数がエラーをスローする可能性があり、呼び出し側がその状況を処理しなければならないと明示的に宣言した場合は、typed exceptionの関数シグネチャでthrowsを宣言します。