【新人エンジニア向け】Javaのチェック例外 vs 非チェック例外 〜throwsの必要性を完全整理!〜

こんにちは。ゆうせいです。

Javaにおける「例外」は、ただのエラーではなく、きちんと分類された仕組みなんです。
特に重要なのが「チェック例外」と「非チェック例外(実行時例外)」の違い。

この違いを理解していないと、「なんでコンパイル通らないの?」とか、
throws って書いたり書かなかったり…どっちなの?」と悩むことになります。

この記事では、新人エンジニアが混乱しやすい「throws の要・不要の違い」を中心に、
やさしく・確実に理解できるように解説します!


まずは用語整理:チェック例外と非チェック例外とは?

チェック例外(Checked Exception)

  • コンパイル時にチェックされる例外
  • 開発者が 必ず処理(または宣言)しなければいけない
  • 例:
    • IOException(ファイル操作失敗)
    • SQLException(データベース操作の失敗)
public void readFile(String path) throws IOException {
    FileReader reader = new FileReader(path);
}

このように throws IOException を書かないとコンパイルエラーになります。


非チェック例外(Unchecked Exception)

  • 実行時にだけ発生する例外
  • throws記述が不要
  • 主に「プログラムのバグ」が原因
  • 例:
    • NullPointerException
    • IllegalArgumentException
    • ArrayIndexOutOfBoundsException
public void validateAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("年齢は0以上である必要があります");
    }
}

上記では throws IllegalArgumentException書かなくてもOK


throwsキーワードの必要性まとめ

チェック例外(Checked Exception)

  • throws の記述:必須
  • 理由: 呼び出し元が確実にエラー対処できるように強制するため
// 呼び出し元でtry-catch or throws必須
try {
    readFile("data.txt");
} catch (IOException e) {
    e.printStackTrace();
}


非チェック例外(Unchecked Exception)

  • throws の記述:任意(省略可能)
  • 理由: Java側で開発者の責任で処理しろというスタンス
// throws無しでOK
public void doSomething(String input) {
    if (input == null) {
        throw new NullPointerException("引数がnullです");
    }
}


表で比較しよう!

比較項目チェック例外(Checked)非チェック例外(Unchecked)
基底クラスException(ただし RuntimeException を除く)RuntimeException のサブクラス
throws の必要性必要(書かないとコンパイルエラー)不要(書いてもOK、書かなくてもOK)
処理の義務呼び出し側にtry-catch or throwsを強制処理しなくてもコンパイルは通る
よくある用途外部とのやり取り(IO, DB)などプログラミングミスや設計ミスの検出

実例で理解!コード比較

チェック例外の例(ファイル操作)

public void loadData() throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
}

呼び出し元では必ずこうしないとダメ:

try {
    loadData();
} catch (IOException e) {
    e.printStackTrace();
}


非チェック例外の例(引数チェック)

public void setAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("年齢は0以上にしてください");
    }
}

呼び出し元は例外を受け取らなくても動作します


なぜJavaは2種類に分けたのか?

チェック例外の目的:

「これは予測できるエラーだから、必ず対処してください

→ ファイルが存在しない、DB接続が切れた…など、外部要因が原因のケース。


非チェック例外の目的:

「これはプログラマのミスだから、事前に気をつけて設計してね」

→ 配列の範囲ミス、nullアクセスなど。try-catchより防止設計が大事


結論とアドバイス(新人向け)

  • 「throws が必要か?」と迷ったら、それが「外部要因のエラー」か「プログラムのミス」**かで考えよう!
  • コンパイル時にエラーが出る → チェック例外。ちゃんと throws or try-catch を書く。
  • throws が不要でも、設計として意図を明示したいときはあえて書くのもアリ!

次に学ぶとよいテーマ

  • ExceptionError の違い
  • RuntimeException を使った設計方針の善し悪し
  • try-with-resources での自動クローズと例外処理の両立

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。