Java SE7 Gold 取得を目指して (9)


Java SE7 Gold をとりたい…!

本日は第9回目です。
Java7でいろいろと変更のあった例外についての章でした。

今日のこぼれ話

いろいろなプログラミング言語を操る人々を「言語+er」で読んだりしますよね。Javaer、PHPerとか。
Javaerとか字面はかっこいいんですけど、声に出すと今ひとつだなーと思っていたのですが、Javaristaなんてのがあるらしいです。
Baristaとかけているらしくかっこいいので使おうかな…? まだまだちょっと気恥ずかしいですね。

プログラマーの通り名まとめ

本日知ったこと(7章)

  • try-catch

    • ↓はコンパイルエラー(ただ派生クラス側が処理されないだけだと思っていた)
    public void excec() {
     try {
       someMethod();
     } catch (Exception e) {
       // 親例外クラスが先
     } catch (NullPointerException e) {
       // 派生例外クラスが後
     }
    }
    
    • Java7より↓のコンパイルが通る(6以前ではコンパイルエラー)
    public void excec() throws MyException1, MyException2 {
     try {
       if (!check1()) {
         throw new MyException1();
       }
       if (!check2()) {
         throw new MyException2();
       }
     } catch (Exception e) {
       e.printStackTrace();
       throw e
     }
    }
    
    • Java7より派生関係のない例外を|で区切ってマルチキャッチが可能
    catch(IOException | SQLException e) {
     e.printStackTrace();
     // e は final になる
    }
    
  • try-with-resources

    • Java7より
    • 複数リソースは;区切り
    • リソースクラスはClosableまたはAutoClosableを実装する
    • 例外発生 → close() → catch節 → finally節 の順で呼ばれる
    • 複数リソースを取得していた場合、取得順とはclose()が呼ばれていく
    try (MyResource1 res1 = new MyResource1();
         MyResource2 res2 = new MyResource2()) {
     someMethod();
     // res2.close()
     // res1.close()
    } catch (Exception e) {
    }
    
    • try-with-resource内とcloseの両方で例外が発生した場合closeでの例外は抑制される
    • 取得したければ e.getSuppressed()
  • アサーション

    • アサーション有効化は java -ea XXXX
    • プログラム中のバグを発見する機能なのでコード上からハンドリングできないようになっている

try-with-resources、これでやっとファイルの読み書きだけでtry-catchを2度も書くようなコードとはおさらば出来るんですね…!