【Java】ExceptionとRuntimeExceptionの違いを教えて!!

Javaにおいて、Exception と RuntimeException は両方とも例外(Exception)の種類を表しますが、いくつかの重要な違いがあります


1. 検査例外(Checked Exception)と非検査例外(Unchecked Exception)

  • Exception は通常、検査例外を指します
    これは、コンパイル時に捕捉(try-catch ブロックで処理)または宣言(throwsキーワードを使用してメソッドに伝播)が必要な例外です
  • RuntimeException は非検査例外(またはランタイム例外)であり、コンパイル時にチェックする必要がない例外です
    通常、プログラムの実行中に発生しやすいランタイムエラーを表します

2. 例外の種類

検査例外(Exception)の使用

  • 外部リソースとの対話
    ファイルの読み書き、データベースアクセス、ネットワーク通信などの外部リソースとの対話では、検査例外を使用することが一般的です
    プログラマが明示的なエラーハンドリングを行い、リソースが正しく解放されることが確実になります
  • 回復可能なエラー
    プログラムが回復できるエラーが発生した場合、検査例外を使用して適切にハンドリングすることが重要です
    例えば、ユーザーにエラーメッセージを表示して再試行を促すなどのアクションが考えられます
  • トランザクション管理
    データベーストランザクションなど、コードの一部が失敗した場合にロールバックする必要がある場合、検査例外を使用してトランザクションを適切に管理します

非検査例外(RuntimeException)の使用

  • プログラマのミスや実行時のエラー
    通常、プログラマのミスによるエラー(例えば、NullPointerException、ArrayIndexOutOfBoundsException)や、実行時に発生するエラーに対しては非検査例外を使用します
    これらは通常、プログラムの正しさに対する前提条件の違反を示します
  • アプリケーションの不整合
    アプリケーションの状態が不整合になった場合、非検査例外を使用して異常終了させることがあります
    問題が早期に検出され、デバッグが容易になります。
  • ユーザーからの不正な入力
    フォームの入力など、ユーザーからの不正な入力に対しては、非検査例外を使用して適切に対処することができます

3. 実装例

// Exception をキャッチする例(コンパイルエラーが発生する可能性がある)
try {
    FileInputStream file = new FileInputStream("file.txt");
    // ファイルからデータを読み込む処理
} catch (IOException e) {
    // IOExceptionを捕捉
    e.printStackTrace();
}

// RuntimeException はキャッチする必要がないが、キャッチしても問題ない
try {
    int result = 10 / 0; // ArithmeticExceptionが発生
} catch (ArithmeticException e) {
    // ArithmeticExceptionを捕捉
    e.printStackTrace();
}

通常、検査例外は外部リソースとの対話などで発生し、それらに対処するために明示的なハンドリングが必要です

一方で非検査例外は、プログラマのミスや実行時のエラーを表し、通常は適切な対処が難しいため、プログラマが回復できる場面でのみキャッチすることが一般的です

違いが少しわかってきましたかね。。。?
是非参考ください!

ではっ

是非フォローしてください

最新の情報をお伝えします