Javaを勉強していると、最初のうちは順番に処理が進む「基本的なコード」ばかりを書きます。
しかし、現実のアプリ開発では「思わぬトラブル」が起きることがよくあります。
- ファイルが見つからない
- 数字に変換できない文字が入力された
- 0で割ろうとしてしまった
こんなときに、Javaでは**例外処理(エラーハンドリング)**を使って、エラーに強いプログラムを書くことができます。
この記事では、初心者の方でも安心して読めるように、Javaの例外処理をやさしく・丁寧に解説していきます。
例外処理は最初こそ難しく感じますが、慣れればJavaの強力な味方になります。
💥 例外とは?エラーとの違い
プログラムの実行中に起こる**「想定外の事態」**をJavaでは「例外(Exception)」と呼びます。
よく混同されるのが「エラー(Error)」ですが、Javaではこの2つを明確に区別しています。
- エラー(Error):JVM(Javaのエンジン)レベルの重大な問題 → 原則として回復不可能
- 例外(Exception):プログラムのミスや予測可能な問題 → try-catchで対処可能
たとえば、0で割るとか、配列の範囲外を参照するといったことは、「例外」として扱われます。
⚙️ Javaの例外処理の基本構文
Javaの例外処理は、主に try-catch-finally
の形で記述します。
1 |
try {<br> // エラーが起きそうな処理<br>} catch (Exception e) {<br> // 例外が発生したときの処理<br>} finally {<br> // 最後に必ず実行する処理(省略可)<br>}<br> |
それぞれの意味を見てみましょう:
- try:ここに書いた処理の中で例外が発生するかもしれない
- catch:try内で例外が起きたら、このブロックで処理
- finally:例外の有無にかかわらず、最後に実行(後始末など)
🔍 実例:ゼロ除算を安全に処理
1 |
try {<br> int result = 10 / 0;<br> System.out.println(result);<br>} catch (ArithmeticException e) {<br> System.out.println("0で割ることはできません!");<br>} finally {<br> System.out.println("処理終了!");<br>}<br> |
実行結果:
1 |
0で割ることはできません!<br>処理終了!<br> |
→ プログラムが「途中で止まらず」動き続けることがわかります。
📚 よく使う例外クラス一覧
例外クラス | 内容 | 発生例 |
---|---|---|
ArithmeticException | 算術エラー | ゼロ除算など |
NullPointerException | nullの変数にアクセス | nullのままメソッドを呼ぶ |
ArrayIndexOutOfBoundsException | 配列の範囲外 | arr[3] など |
NumberFormatException | 文字列→数字変換失敗 | "abc" をInteger.parseInt() |
IOException | 入出力エラー | ファイルがないなど |
💡 catchブロックの書き方いろいろ
単一catch
1 |
catch (NumberFormatException e) {<br> System.out.println("数字に変換できません!");<br>}<br> |
複数catch(パターン分け)
1 |
try {<br> // 処理<br>} catch (IOException e) {<br> System.out.println("ファイルエラー");<br>} catch (NumberFormatException e) {<br> System.out.println("数字エラー");<br>} catch (Exception e) {<br> System.out.println("その他のエラー");<br>}<br> |
catchは上から順に実行され、最初に一致した1つだけが実行されます。
🧱 finallyはなぜ必要?
finallyは、例外の有無にかかわらず必ず実行される処理を記述したいときに使います。
- ファイルを閉じる
- DB接続を切る
- ログを残す
1 |
try {<br> FileReader reader = new FileReader("file.txt");<br> // ファイル読み込み処理<br>} catch (IOException e) {<br> System.out.println("ファイル読み込みエラー");<br>} finally {<br> System.out.println("後始末完了");<br>}<br> |
🎯 throwとthrowsの違い
throw:例外を投げる
1 |
if (x < 0) {<br> throw new IllegalArgumentException("xは0以上にしてください");<br>}<br> |
throws:例外を投げることを宣言
1 |
public void readFile() throws IOException {<br> FileReader fr = new FileReader("test.txt");<br>}<br> |
throws
を使うと、呼び出し元に「このメソッドは例外を投げる可能性がありますよ」と伝えられます。throw
は「実際に例外を投げる」動作。
📦 チェック例外 vs 非チェック例外
Javaでは例外を大きく2種類に分類しています。
✅ チェック例外(Checked Exception)
- コンパイル時に処理が必要
IOException
、SQLException
などtry-catch
またはthrows
が必須
❎ 非チェック例外(Unchecked Exception)
- 実行時に発生
NullPointerException
、ArithmeticException
など- 強制的な処理は不要(ただし書くのが望ましい)
🔁 例外伝播(Exception Propagation)
メソッドの中で例外が発生し、それを上位メソッドに伝えて最終的に1か所で処理する仕組みです。
1 |
public void methodA() throws IOException {<br> methodB();<br>}<br><br>public void methodB() throws IOException {<br> FileReader fr = new FileReader("abc.txt");<br>}<br> |
上位メソッドが責任を持ってcatchすることもできます。
🧠 スタックトレースの活用
catchの中で e.printStackTrace()
を使うと、どこで例外が起きたかが分かります。
1 |
catch (Exception e) {<br> e.printStackTrace();<br>}<br> |
開発中はとても便利なデバッグ情報になります。
🚫 例外処理でありがちな失敗
❶ catchが空
1 |
catch (Exception e) {<br> // なにも書かない<br>}<br> |
→ エラーがあったことに気づけない!
❷ 何でもExceptionでcatchする
1 |
catch (Exception e) {<br> // すべてのエラーを1つで処理(よくない)<br>}<br> |
→ 問題の種類に応じた対応ができません。
❸ tryの範囲が広すぎる
1 |
try {<br> // たくさんの処理を一気に<br>} catch (...) {<br> // どこで問題が起きたか不明<br>}<br> |
→ 最小限の範囲でtry-catchを使いましょう。
📘 実用コード例:ファイル読み込み
1 |
public void readTextFile(String filename) {<br> try {<br> BufferedReader reader = new BufferedReader(new FileReader(filename));<br> String line;<br> while ((line = reader.readLine()) != null) {<br> System.out.println(line);<br> }<br> reader.close();<br> } catch (FileNotFoundException e) {<br> System.out.println("ファイルが見つかりません");<br> } catch (IOException e) {<br> System.out.println("読み込みエラー");<br> }<br>}<br> |
📌 よく使う例外クラスまとめ表
クラス | 対応エラー | 対策方法 |
---|---|---|
ArithmeticException | 0除算など | try-catch |
NullPointerException | null参照 | nullチェック |
ArrayIndexOutOfBoundsException | 配列の範囲超え | インデックスチェック |
IOException | 入出力系 | try-catchかthrows |
NumberFormatException | 数字変換失敗 | 入力チェック |
IllegalArgumentException | 不正な引数 | throwで例外投げる |
🎓 まとめ
Javaの例外処理は、「プログラムが止まらないように」「ユーザーにやさしく」「安全に動かす」ためにとても大事です。
この記事のポイント:
- 例外とは「想定外の出来事」
- try-catch-finallyで安全に処理
- throwとthrowsで例外のやりとり
- チェック例外は必ず対処が必要
- catchの中では適切な対応を行う
📖 Javaをもっと学びたい方へ
まずは、絶対にJavaプログラマーになりたい人へ。 を読んで、例外処理以外の基本も学びましょう。
さらに実践的な指導や、コードレビュー、転職支援も受けたいなら、サイゼントアカデミー をチェックしてみてください。
あなたのJavaライフが、もっと安全で、もっと快適になりますように。
コメント