10月31日の学び②
- エラーと例外は違う。
- エラーや例外の実体はインスタンス。
- 「エラーが発生してプログラムが強制終了」「例外が発生してプログラムが強制終了」「例外が発生したがプログラムは強制終了しない」の3通りがあることを意識。
Javaの例外概要(大切)
土台としてエラーと例外の2つあることを意識
- Error:回復の見込みがないためJVM側で自動終了する。
- Exception:2種類ある。
エラー
- java.lang.OutOfMemoryErrorのメモリ不足時など。
- ログさえ出せないので直ちに停止するべき。
- すべてcatchして処理するのが常に正しいわけではない
検査例外
- コンパイラがコンパイル時にチェックする例外。例外処理の実装がないとコンパイルに失敗する。
- FileNotFoundExceptionやSQLExceptionなど。
- アプリケーション側ではファイルがなかったりした場合はどうしようもない。この例外が発生した場合に責任はアプリケーション側にはない。
- アプリケーションには責任はないが発生する可能性はあるので処理が必要な場合に用いる。
- 検査例外を使えば堅牢なアプリケーションとなるが、あちこちに例外処理のthrow/catchが散在する。
実行時例外
- コンパイラがチェックしない例外。例外処理の実装がなくてもコンパイルに成功する。
- NullPointerException やIndexOutOfBoundsException。
- アプリケーションのバグが原因なので、この例外が発生した場合には責任はアプリケーション側。
- catchを実装してもしなくてもよい。
実装例
例外の上位へのスローと自分でのcatchが同居するケースも当然ある。
void doSomething() throws MySpecificException { try { foo(); } catch (IOException e) { throw new MySpecificException("failed my specific task", e); } }
10月31日の学び
昨日ちょっと書いたことの続き
Javaの例外の概要
- Javaでは例外が発生しうる処理を呼び出した時try/catch構文を用いて「例外を回復」するか、thorws句にてその例外を上位レイヤーに「通知」するかのどちらか
- どこで誰が「通知」「回復」するかは設計時に考慮が必要
検査例外
- もともと例外が発生することを事前に想定しその処理を仕様として扱う
- 処理を行ったときに発生する可能性のある例外をthrow句にて宣言
- 呼び出し元でcatchがないとそもそもコンパイルできない
- 拡張性を考慮して検査例外を使うにはクラス設計の段階から発生しうる例外を種別毎に意識しておくことが必要
class DataStorage { DB storage = DB.initialize(); public Data read(string key) throws DBException { return storage.find(key); } }
非検査例外
- 例外が発生した場合にcatch節やthrows句で対応してはならない/対応する必要はない例外
- RuntimeExceptionとそのサブクラスが非検査例外
class Example { public static void main (String[] args) { Example.methodA(); } public static void methodA() { throw new RuntimeException("throws unchecked exception"); } }
10月28日の学び
↓のサイトは神レベルなので時間があるときに読み込んでおくこと
qiita.com
「仕様の明確でないメソッドを作るのは迷惑行為です!」 「自分にしか理解できないコードを書くことは迷惑行為です!」 「API の仕様を説明できないのであれば、正しいユニットテストを書くことはできません!」
コメントの種類
privateメソッドの場合は後者であり、publicメソッドの場合は前者が相当する - 使い方に関するコメント:APIの利用者向け - 実装に関するコメント:APIの開発者向け
Javadoc
Javadocって自動生成できたのか(オイオイ) - Javaのソースコードを元に自動生成されたコメント
Chain of Responsibilityパターン
- 移譲による継承パターン
- とくに見るべきものはないが、連鎖を以下のように実装できるのは覚えるべき
alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);