SJC-P対策 例外処理
例外処理について
javaの例外処理である「try, catch, finnaly」について
出題範囲となる箇所をメモ。
try句、catch句、finnaly句
try句の後は、必ずcatch句か、finnaly句が必要。
それがなければ、コンパイルエラーになる。finnaly句は例外の発生に関わらず、try句以降に実行した
処理の後始末をするための仕組み。たとえばファイルの入出力などに関しては、ファイルを開いた後に
例外が発生したとしても開いたファイルは、必ずを閉じなければいけない。
try{ //ファイルを開く //ファイルの読み書き } catch(IOException e) { //ファイル操作での例外発生 } finnaly { //開いたファイルを必ず閉じる } |
tryとcatchとfinnalyの間には、他の処理をはさむ事はできない。
try { //hogehoge } System.out.println("hogehoge"); //コンパイルエラー catch (Exception e) { } |
例外の伝達
例外は必ずキャッチする必要は無い。ただしアプリケーションのエントリポイントであるmain()にまで
例外が到達すると、main()からJVMに例外が投げられる。
そうすると、JVMがクラッシュしてアプリケーションが停止する。JVMがクラッシュした際は、スタックトレースが出力される。
つまりら以外の発生した場所から、コールスタックを辿った
順に例外が伝達されたメソッドを出力する。
class Test { public static void main(String args[]) { f1(); } public static void f1() { f2(); } public static void f2() { f3(); } public static void f3() { f4(); } public static void f4() { f5(); } public static void f5() { //0除算エラー System.out.println(10 / 0); } } |
この場合、例外をまったくキャッチしていないので
発生した例外は、JVMをクラッシュさせます。
f5() //throw Exception f4() //throw Exception f3() //throw Exception f2() //throw Exception f1() //throw Exception main() //throw Exception to JVM |
例外階層
例外クラスも、元を辿ればObjrctクラスです。ExceptionクラスはThrowableを継承しています。
他のThrowableを継承しているクラスとして、
Errorクラスがあります。Errorは例外とは違い、あまり気にしなくとも良いです。
普通エラーが起こったときは、アプリケーションを回復できる
見込みが少ないので少なくともErrorをキャッチする必要は無い。ただし、Errorクラスのオブジェクトも例外クラスと同じように
キャッチする事ができる。
例外マッチング
ある特定の例外をキャッチする際に、キャッチするオブジェクトクラスは
範囲の狭い例外クラスから指定しなければいけない。たとえばファイル入出力の例外を書くとき。
try { //HogeHoge } catch(IOException e) { //hoge } catch(FilrNotFoundException ex) { //ここには到達しない } |
このコードをコンパイルするとエラーが発生する。Exceptionクラスの参照関係は、IOExceptionクラスの方が、例外の受けが広い。
よって、ファイル入出力関係の例外は、全てIOExceptionが受け止めてしまう。