Javaの例外 ざっくりメモ

自分の中でJavaの例外の理解がフワフワで、エラーの親戚くらいの理解だったので、少し前進したい。
余談だが「フワフワ」の巧みな用法としては、ヘイポーの謝罪文における「~アメリカ人はセ〇〇スとスキンシップの境界がフワフワしており~」が挙げられると思います。
ともあれ、ちょっくら理解が進んだよメモを残す。


▼例外の概要
例外は、NullPointerなんちゃらExceptionとか、だいたい「Exception」て付いてたらきっと例外。
どうやら例外は、大きく2種類に分類可能らしい。

・チェック例外:try-catchでの処置が必須となる例外。処理しないコードはコンパイルで怒られる。検査例外とも。
・非チェック例外:上記以外。つまりtry-catchでの処理はあってもなくてもいい。非検査例外とも。

前者は、IDEがチェックしてサジェストしてくれる感じだと思う。
そしたら言われたようにtry-catch付けてやれば、コンパイルで怒られることは無くなる。
後者は、コンパイル通るんだけど、プログラム実行中に何らかの処理をしようとして落ちて、ログ見たら「あ、例外だ」みたいになるやつ。Nullなんちゃらとかはこっちの仲間だろう。

例外が発生したさまを、「例外を投げる」「例外が投げられた」などと言うみたいだ。
なるほど、例外で「throw(s)」という単語が出てくるのはそういうことか、と得心した。
まあ「エラーを吐く」とかと似たようなニュアンスなのだろう。
んで、投げられた例外を何も処置しないと、そこでプログラムが終了しちゃう。
よく見る、”エラーです!(赤字)" みたいなやつの原因は大体コレなのかな。


▼例外を処置してやる
例外の処置だが、
・本人:発生させる処理(メソッド)自身。
・呼び出し者:その処理(メソッド)を呼んだやつ。
のどちらかで処置できる。


▼例外を、呼び出し側で処理してやる形
本人側(定義側)では、自身の実装コードの中で発生しそうな例外に見当を付けて、それをthrowsで投げてやる。
投げつける先は、呼び出し側。つまり呼び出し側は、投げられてくるかもしれない例外をtry-catchで捕まえて、捕まえたときの処遇を記述する必要がある。
たぶん「例外を投げる可能性があるメソッド(~throws なんちゃらException とか書かれてるメソッド)を呼び出す側は、投げられてくるかもしれない例外への処置をtry-catch文で書いとかないとダメ」てことだろう。

//本人(定義)
public void method() throws Exception{
    //何か例外起きそうなコード
}

//呼ぶ側
try{
    method();
} catch(Exception e) {
    //method()を実行して例外が発生した場合、ここに入る。
    //例外eは、持ってるメソッドで例外の中身を表示したりとかできるようだ。
}


▼例外を、本人(メソッド自身)が処置する形
・ここに来たら例外を投げるようにしよう、と意図して例外を投げる。
・ここで例外発生するかもなのでtry-catchしとこう。
・・・といったことができるようだ。

//本人(定義)
public void method(){
    if(hoge == 0){    //ここに入ることは想定されないがもし入ってきたら・・・そうだ例外投げよう。
        throw new Exception("Exceptionが発生したヨ");
    } else if(・・・・){
        try{
            hogehogeMethod();  //例外を投げるかもしれない処理
        } catch(Exception e) {
            //例外捕まえたときの処理を記述する。
            ・・・・
        }
    }
}

//呼ぶ側
method();    //呼ぶだけ。


▼そのほか
try-catch-finallyてのがあって、finallyブロックには必ず実行したい処理を書くことができる模様。
んで、新しいJavaだと、try(例外投げる処理)~みたいに書けるようで、try-with-resources 構文とかリソース付きtryとか言われるものらしい。
これまではfinallyに閉じる処理を書いてたけど、そうせずとも閉じることが保証される、とのことだが、ちょっと何言ってるか分かんないので別途調査しよう。

例外は自分で作ることもできるみたいだ。これも別途調査しよう。

最初からある例外も、自作の例外も、親としてExceptionクラスを共有する。
よって、例外を投げたり捕まえたりする際、Exceptionと記述すればあらゆる例外をひっかけられる。
が、それだと例外のこまかな種別に応じた処理を書き分けるのが無理(困難)なので、適切な種別のExceptionを使い分けるのが良い作法のようだ。
分かってる人が見るとかなり印象悪いようなので気を付けたい。

例外をcatchするがそのcatch時の処理を何も書かないことを、例外を「食べる」とか「もみ消す」とか言うらしく、同様のスラングに「キャッチアンドリリース」てのがあるそうで少し笑った。今度使ってみたい。
なおこれやっちゃうと、実は問題ある動作をしてるのにそれをもみ消してるせいで問題無くプログラムが動いてるように見えてしまう、てことになって、バグを潜在させてしまう問題行動のようだ。
 ・もみ消すくらいなら最初からcatchせずに例外でプログラム異常終了させるほうが、気づきやすいぶんまだマシ。
というのが正論だろうか。かたや面倒事を隠蔽したい邪なPGなどは、
 ・ここ例外投げることあるけどよく分かんねーし解析とかめんどいからもみ消しちゃえ。
みたいに考えたりするのかもしれない。ダークサイド堕ちしないようにせねば。これも気を付けたい。