package z_sample.lec.s0140;

import java.io.FileReader;
import java.io.IOException;

import jp.avaj.lib.debug.L;

/** 例外処置の仕方のサンプル */
class ExceptionTreatment {
  public static void main(String[] args) {
    L.phead("例外処置の仕方のサンプル");
    try {
      method0();
      try {
        // 当メソッドは例外を発生するので、
        // この後のメソッドをテストするためtryをする
        method1();
      }
      catch(Exception ex) {
        ex.printStackTrace();
      }
      try {
        // 当メソッドは実行時例外を発生するので、
          // この後のメソッドをテストするためtryをする
        method2();
      }
      catch(Exception ex) {
        ex.printStackTrace();
      }
      method3();
    }
    catch(Exception ex) {
      // 例外が発生した時に必要な処理を記述する
      // サンプルとしてスタックトレースを表示する
      ex.printStackTrace();
    }
    finally {
      // 処理なし
    }
    L.phead("終了 - 例外処置の仕方のサンプル");
  }

  /** 例外をcatchで処理するメソッド */
  public static void method0() {
    //
    FileReader fr = null;
    try {
      // 存在しないファイルを指定してわざと例外を発生させる
      fr = new FileReader("ZZZ.txt");
      // frを使用する処理 - サンプルなので以下は省略
    }
    catch(IOException ex) {
      // 例外が発生した時に必要な処理を記述する
      // サンプルとしてスタックトレースを表示する
      ex.printStackTrace();
    }
    finally {
      // ファイルをクローズする
      // 注、クローズ処理は絶対にfinallyの中でやること
      if (fr != null) {
        // クローズ処理はnull判定をした上で行うのが常識
        try {
          // クロース処理自体も例外を発生するかもしれないのでtryする
          fr.close();
        }
        catch(Exception ex) {
          // クローズで例外がはっせいしたら、ほとんど手の打ちようがない
          // 他に間違いがあるはず
          ex.printStackTrace();
        }
      }
    }
  }

  /**
   * 例外を上位にthrowするサンプル
   * 発生するかもしれない例外をthrowsに記述する必要がある
   */
  public static void method1() throws IOException {
    FileReader fr = null;
    // 例外を上位にthrowする場合は必ずしも try する必要はない
    // しかし、この場合は、finallyでクローズ処理をする必要があるのでtryする
    try {
      // 存在しないファイルを指定してわざと例外を発生させる
      fr = new FileReader("ZZZ.txt");
    }
    // 例外を上位にthrowするのでcatchは記述しない
    finally {
      if (fr != null) {
        // クローズで発生す例外も上位にthrowする
        fr.close();
      }
    }
  }
  /**
   * 実行時例外(RuntimeException)を発生するサンプル
   */
  public static void method2() {
    String str = "aaa";
    // この文字列をintに変換する
    // 実際には変換できないのでRuntimeExceptionが発生する
    // RuntimeExceptionは tryやthrowをしなくてもコンパイルエラーにならない
    int i = Integer.parseInt(str);
    L.p(i);
  }
  /**
   * 実行時例外(RuntimeException)を明示的に処理するサンプル
   */
  public static void method3() {
    String str = "aaa";
    int i;
    try {
      // この文字列をintに変換する
      // 実際には変換できないのでRuntimeExceptionが発生する
      // RuntimeExceptionは tryやthrowをしなくてもコンパイルエラーにならない
      i = Integer.parseInt(str);
    }
    catch(Exception ex) {
      // strが数値に変換できない場合は 0 とみなす
      i = 0;
    }
  }
}


//
//==
//  Java 例外の処置
//  http://blogs.yahoo.co.jp/artery2020/39982891.html
//・目次 - Java 例外処理
//  http://blogs.yahoo.co.jp/artery2020/39982881.html
//・目次 - Java言語プログラミング入門
//  http://blogs.yahoo.co.jp/artery2020/39975776.html
//・目次 - ビジネスパーソンの常識と非常識
//  http://blogs.yahoo.co.jp/artery2020/39728331.html
//・目次 - 論理・発想・思考についての考察と鍛え方
//  http://blogs.yahoo.co.jp/artery2020/39657784.html
//== ended.