2013年4月29日月曜日

java のエラーと例外

ざっと java の概要を拾い読みして、特に java のエラーと例外について以下のような疑問をもった。
  • 例外が想定外のエラーなの?
  • エラーと例外を全部catchしないといけないの?
  • catchした例外情報を最上位まで返せないの?
  • catchするけど最上位までスタックトレース情報を返せないの?
  • エラーが起きたときって次行にすすまないの?
  1. 例外が想定外のエラーなのか?
  2. 例外っていうと想定外の事態で、エラーっていいうと一応想定内な事態な印象を持つけれどOOPSでは逆なんですね。例外は通常起こりえるエラーを指し、エラーは致命的なエラーを指しているのですね。で、例外処理で相手にしているのは通常起こりえるエラーの方で、致命的なエラーは java 本体のエラー補足にまかせて異常終了というのが大筋なんですね。

  3. エラーと例外を全部catchしないといけないの
  4. 例外の説明では例外の補足方法について説明されるけれど、返す可能性のある例外は全部 catch しないといけないのか、それとも、必要な例外のみを補足すればよいのかよくわからない場合が多い。catch、throw、throws は密接に関係しているので最後に全部セットにしたエラー処理のサンプルのようなものが欲しいと思う。結論からいえば、catch で全部の例外を補足する必要はなく、返す可能性のあるエラーは全て throws に列挙すれば上位の関数に例外がそのまま伝わるらしい。

  5. catchした例外情報を最上位まで返せないの
  6. 一旦キャッチしたエラーは、throw で自分で例外を上位に投げなければそこでそのエラーは無くなってしまう。一旦 catch して何か処理施した後、上位にエラーを解したい場合は「throw エラー」として上位関数に自らエラーは投げなければならない。もちろん、キャッチしなかったエラーは、throws に定義した通り自動的に上位関数に引き継がれる。

  7. catchするけど最上位までスタックトレース情報を返せないの
  8. catch したエラー情報に含まれれ、e.printStackTrace()で出力できるスタックトレース情報は、catch してただ throw するだけだとそれまでのスタックトレース情報が無くなってしまう。それまでのスタックトーレス情報を引き継ぎながらthrow するには、catch した例外情報 e を throw のパラメータとして上位に投げると最上位までスタックトレース情報が引き継がれる。

  9. 例外時のリソースの解放って終了すれば解放されるの
  10. 例外時にリソースの解放処理を上手に仕組ないとリソースの使い切りに繋がりますという説明をよく見かけるけど、常駐プロセスとして動く場合の注意点だという注意書きが欲しい気がする。オブジェクト指向のクラスとは、再利用性をよく考慮された関数群のようなものだから、再利用を考えればリソースの使いきりの可能性があるコードは確かによくないけれど、利用機会の限られたツールなどを作る場合には絶対に守らなければならないルールではないと思う。

  11. エラーが起きたときって次行にすすまないの
  12. 致命的なエラーが起きたときの処理内容を確かめるのに、致命的なエラーの発生方法がわからないと実験のしようがないので、正しい処理コードの記述方法もわかりません。たとえば、リソースの解放処理とか、次行に進まないための考慮とか必要ないのかなど思い悩みます。そんな時に便利な「int[] arr = new int[0x7fffffff]」である。これでエラー「java.lang.OutOfMemoryError:」が発生させられる。通常はエラーの場合は、try などせず致命的エラーとして java のお世話になれば良いのだと思う。
    import java.io.*;
    public class test03 {
      public static void main(String[] args)
      {
        try {
           int[] arr = new int[0x7fffffff];
           System.out.println("次の処理だ");
        }
        catch(OutOfMemoryError e) {
           System.out.println("メモリエラーだ");
        }
        finally {
           System.out.println("うーーむ");
        }
      }
    }
    
    $ java test03
    メモリエラーだ
    うーーむ
    

0 件のコメント:

コメントを投稿