reading effective java_3rd

15
Reading Effective Java 第3回 あなたとJava 2014.08.08 (Fri) @kawakubox

Upload: -

Post on 24-May-2015

57 views

Category:

Technology


3 download

DESCRIPTION

社内勉強会「EffectiveJava輪読会」の資料

TRANSCRIPT

Page 1: Reading effective java_3rd

Reading Effective Java 第3回

あなたとJava

2014.08.08 (Fri)

@kawakubox

Page 2: Reading effective java_3rd

項目57 例外的状況にだけ例外を使用する

Page 3: Reading effective java_3rd

try { int i = 0; while (true) { mountains[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { !

}

!?

Page 4: Reading effective java_3rd

あ…ありのまま 今 起こった事を話すぜ! !

おれは配列の要素を走査する処理を書いてくれと頼んだと思ったら、try-catchで括られたコードがcomittされてたんだ。

!な…何を言っているのか わからねーと思うが おれも 何をされたのか わからなかった…

Page 5: Reading effective java_3rd

API設計者へ告ぐ… API利用者に通常のフローで例外を強制しないこと。 !

Iteratorパターン利用したAPIを例に挙げる

for (Iterator<Card> ite = cards.iterator(); ite.hasNext(); ) { Card card = ite.next(); }

next()メソッドは、iteratorの位置に依存している ➡状態依存メソッド hasNext()メソッドは、次の要素の有無を検査する ➡状態検査メソッド !状態検査メソッドがないAPIを立付けると、 例外を捕捉することでしか配列走査処理を実装できなくなる。

Page 6: Reading effective java_3rd

項目58 回復可能な状態にはチェックされる例外を、 プログラミングエラーには実行時例外を使用する

Page 7: Reading effective java_3rd

Exception

Throwable

Error

Runtime Exception

OreOreThrowable

MyError

GirlfriendNotExists ExceptionOwata

Exception

 Javaにおける例外/エラーの種類

OutOfMemory Error

API呼び出し側で回復できるような状況にはチェックされる例外を適用する

Page 8: Reading effective java_3rd

Exception

Throwable

Error

Runtime Exception

OreOreThrowable

MyError

GirlfriendNotExists ExceptionOwata

Exception

OutOfMemory Error

プログラミングエラーには実行時例外を適用する

ex) APIの事前条件エラーなど

 Javaにおける例外/エラーの種類

Page 9: Reading effective java_3rd

Exception

Throwable

Error

Runtime Exception

OreOreThrowable

MyError

GirlfriendNotExists ExceptionOwata

Exception

OutOfMemory Error

JVMの実行継続できない状況にはエラーを適用する

 Javaにおける例外/エラーの種類

Page 10: Reading effective java_3rd

Exception

Throwable

Error

Runtime Exception

OreOreThrowable

MyError

GirlfriendNotExists ExceptionOwata

Exception

OutOfMemory Error

ErrorはJVMが使用するという根強い慣習があるので、基本自作しない。

Exceptionを継承しない例外も作れるが、API使用者の混乱のもと。 やらない

 Javaにおける例外/エラーの種類

Page 11: Reading effective java_3rd

チェックされる例外を自作する場合は、 回復させるための情報を保持しよう

/** * 残高不足例外<br /> * 何らかの処理において残高不足の場合に発生する例外<br /> * 代金と所持金を保持できるので、API利用者へ * 例外が発生した理由を通知することができます。<br /> */ public class InsufficientFundsException extends Exception { private int price; // 代金 private int pocket; // 所持金 ! public InsufficientFundsException(int price, int pocket) { } ! public int getPrice() { … } public int getPocket() { … } }

Page 12: Reading effective java_3rd

項目59 チェックされる例外を不必要に使用

するのを避ける

Page 13: Reading effective java_3rd

 API使用者が以下のような手を打つしかできないような、チェックされる例外はだめ

} catch (GirlfriendNotExistsException e) { // 決しておこるべきではない!!! throw new AssertionError(); }

} catch (GirlfriendNotExistsException e) { logger.error(“そっ閉じ”, e); System.exit(1); }

Page 14: Reading effective java_3rd

最後に

Page 15: Reading effective java_3rd

チェックされる例外なんて なくなってしまえばいいのに