例外(exceptions)は、Javaにおけるエラー処理のメカニズムです。スローされるオブジェクトはすべてThrowableの派生クラスです。主に二つのカテゴリーがあります:
RuntimeExceptionを除くExceptionの子孫):明示的に処理するか、throwsを使ってメソッドシグネチャに宣言する必要があります。RuntimeExceptionの子孫):明示的に処理する必要はなく、任意の場所で発生する可能性があります(例えば、NullPointerException)。いつ使用するか?
public void readFile(String path) throws IOException { // Checked exception — 処理が必要 Files.readAllLines(Paths.get(path)); } public void divide(int a, int b) { int c = a / b; // Unchecked — ArithmeticException }
throwsを宣言しないメソッドがchecked exceptionをスローすることはできますか?
回答: いいえ、コンパイラーはメソッドシグネチャ(throws)に宣言されていないchecked exceptionをスローすることを許可しません。しかし、unchecked exceptionは警告なしにスローされる可能性があります。
void foo() { throw new IOException(); // コンパイルエラー }
ストーリー
インターネットバンキングでは、クライアントが
SQLExceptionsの処理を無視し、uncheckedラッパーを使用することを決定しました。その結果、ドライバーの更新中に見えないエラーが発生し、データの不整合につながりました。
ストーリー
ロギングアプリケーションでは、ロガーファイルがキャッチされていないchecked exception(
FileNotFoundException)のためにロックされたままで、呼び出しチェーン内で「失われ」、タイムリーに処理されず、アプリケーションはログに書き込むことができなくなりました。
ストーリー
取引プラットフォームでは、チームが全体のcatch(Throwable)を実装して「決してクラッシュしない」ことを目的としました。結果的に、クリティカルなunchecked exceptionsが隠蔽され、アプリケーションは不整合な状態で動作を続け、複雑なバグやデータ損失を引き起こしました。