Java 例外に基本的な疑問があります
つまり、すべてのチェック済み例外はException
class から拡張され、未チェックの例外は から拡張されRuntimeException
ます。しかし、ランタイム例外もから拡張されException
ます。
しかし、なぜ伝播するのですかtry
...catch
ブロックはチェックされているがチェックExceptions
されていない例外ではありませんか?
一般に、catch
処理する特定のタイプの例外ごとに異なるブロックを追加する必要があります。チェックされた例外を(再スローすることによって)処理しようとしている場合は、どのタイプの例外を再スローするかを知っておく必要がありcatch
ます。ブロックを追加して、それらの各例外タイプを再スローするだけです。
最も簡単な方法は次のとおりです。
try {
//do stuff
} catch(RuntimeException e) {
throw e;
} catch(SpecificCheckedException e) {
//handle
} catch(Exception e) {
//handle
}
Exception
「どうすればキャッチできRuntimeException
ますか?」と尋ねていると思います。
あなたはおそらくそれをしようとすべきではありません。可能であれば、特定の種類の例外をキャッチする必要があります。すべてのエラーを処理する必要がある場合は、Exception
キャッチしてすべてをキャッチする必要があります。*
catch (NullPointerException)
できることがわかっている場合は、確認する必要があるため、めったにやりたくないでしょうnull
。コードが原因である場合は、NullPointerException
コードArrayOutOfBoundsException
を修正して、それらがスローされないようにする必要があります。
このコードは、あなたが尋ねたことを実行する方法を示しているはずです:
public static void throwSomething(Exception throwMe)
{
try {
throw throwMe;
}
catch(Exception ex) {
// Check if the object is a RuntimeException
if(ex instanceof RuntimeException) {
// Throw the same object again.
// Cast to RuntimeException so the compiler will not
// require "throws Exception" on this method.
throw (RuntimeException) ex;
}
System.out.println("Caught an instance of a " +
ex.getClass().toString());
}
}
※実はscatch(Throwable)
も含めて全てキャッチしますError
。