【新人エンジニア向け】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の記述が不要- 主に「プログラムのバグ」が原因
- 例:
NullPointerExceptionIllegalArgumentExceptionArrayIndexOutOfBoundsException
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 が必要か?」と迷ったら、それが「外部要因のエラー」か「プログラムのミス」**かで考えよう!
- コンパイル時にエラーが出る → チェック例外。ちゃんと
throwsortry-catchを書く。 throwsが不要でも、設計として意図を明示したいときはあえて書くのもアリ!
次に学ぶとよいテーマ
ExceptionとErrorの違いRuntimeExceptionを使った設計方針の善し悪しtry-with-resourcesでの自動クローズと例外処理の両立
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年11月23日未経験でも迷わない!「成果が出る」新入社員研修の企画・講師スキル・評価まで徹底解説
山崎講師2025年11月23日新人クリエイターのための「生成AIと著作権」完全ガイド
山崎講師2025年11月23日【超入門】Hugging Faceで始めるAI開発!新人エンジニアが最初に触るべきTransformerの基礎と実践
山崎講師2025年11月23日新人エンジニア必見!才能よりも大切な「やり抜く力(グリット)」の鍛え方とは?