2010-12-30 11 views
9

は私がのJava:キャッチ特定の例外

try{ 
//something 
}catch(Exception generic){ 
//catch all 
}catch(SpecificException se){ 
//catch specific exception only 
} 

それはSpecificException渡って来るとき何が起こるか、以下の持って言いますか?それは一般的な例外として最初にそれをキャッチし、特定のオプションをキャッチするか?

また、一般的な例外を無視している間のみ、SpecificExceptionをキャッチします。

一般的なものと特定の特定のものの両方を捕まえたくありません。

+0

質問が含まれていると、コンパイル時エラーが発生します。一般的な例外は、特定の例外の後にする必要があります。 –

答えて

10

いいえ。すべての例外は、最初のブロックで捕捉されます。 2つ目は決して到達できません(コンパイラが認識し、到達不能なコードのためにエラーにつながる)。あなたは、具体的SpecificExceptionを扱いたい場合は、それを他の方法でラウンドしなければならない。

}catch(SpecificException se){ 
//catch specific exception only 
}catch(Exception generic){ 
//catch all 
} 

を次にSpecificExceptionは、最初のブロックでキャッチされ、他のすべての二によるであろう。

+2

これがなぜ受け入れられた答えなのか分かりません。元の質問に示された順序で例外をキャッチしようとするとコンパイルエラーが発生するため、「すべての例外が最初のブロックでキャッチされます」というステートメントは適用されません。 –

+0

javacで確認されていますか? eclipseでは失敗しますが、javacは警告を出すだけかもしれません。 – Bozho

+0

私はマイケルが彼が投稿したコードを参照していると思いました。その場合、彼の声明は正しいです。 – duffymo

21

これはコンパイルされません。特定の例外ブロックに到達できないと伝えられます。

より具体的な例外キャッチブロックが最初にあり、その後に一般ブロックが続きます。

try 
{ 
    //something 
} 
catch(SpecificException se) 
{ 
    //catch specific exception only 
} 
catch(Exception generic) 
{ 
    //catch all 
} 
+0

コンパイラが任意の順序で例外を書き込むことができたとします。どのような違いがありますか?違いは見られません。次に、なぜ注文を実施するのですか? –

+0

私は20歳年上の裕福な男だったと想像してください。どのような違いがありますか?あなたが望むものすべてを想像してみてください。しかし、それがJDKの仕組みです。 – duffymo

+0

そのロジックを使って、何かの理由を見つけるのを邪魔するのはなぜですか?なぜJavaは多重継承を許さないのですか?誰も気にしない ?それだけでそのように動作します。私が作ろうとしているところを見てください。はい、この質問は重要でも重大でもありません。しかし、答えを知っているといいですね。 Chenqui。 –

6

これは、日食のコンパイラでコンパイルしていません:にIOExceptionため

到達不能catchブロックを。それは既に例外のキャッチブロックによって処理されています

これを他の方法で定義します。特定のものだけが捕らえられます。

1

両方のキャッチブロックを呼び出す唯一の方法は、ネストされた例外を使用することです。

try { 
    try{ 
    //something 
    }catch(SpecificException se){ 
    //catch specific exception only 
    throw se; 
    } 
}catch(Exception generic){ 
//catch all 
} 
3

catchブロックは順番に試行され、例外のタイプに一致する最初のブロックが実行されます。 Exceptionはすべての例外タイプのスーパークラスであるため、このインスタンスでは常に実行され、特定のケースは決して実行されません。実際、コンパイラはこれに気づき、コンパイルエラーを引き起こすほどスマートです。

catch句の順序を変更してください。

関連する問題