【Java】もうエラーは怖くない!「例外処理(try-catch)」でトラブルに強いプログラムを作ろう
はじめに
みなさんどうも、おげんです。
プログラミングをしていて、一番心が折れそうになる瞬間っていつでしょうか?
一生懸命書いたコードを実行した瞬間、コンソールに真っ赤な文字で長文のエラーメッセージが出て、プログラムが「ガシャン!」と強制終了してしまったとき…ではないでしょうか。
「あんなに頑張って書いたのに、たった一つのミスで全部止まっちゃうの?」
そう、これまでの私たちのコードは、いわば「すべてが予定通りに進む」ことを前提にした、少し壊れやすい状態でした。
でも、現実の世界では予期せぬトラブルがつきものです。
- 入力されるはずの数字に、間違えて「文字」が入ってきた
- ネットが急に切れて、データが取れなくなった
- 0で割り算をしてしまった(数学的にNG!)
こうした「想定外の事故」が起きても、パニックにならずに「おっと、トラブルですね。ではこう対処しましょう」とスマートに振る舞えるようにするのが、今回学ぶ「例外処理(try-catch)」です。
エラーを「敵」ではなく「想定内の出来事」に変える技術、一緒に身につけていきましょう!
- 赤いエラー文字を見るだけで、心臓がバクバクしてしまう人
- プログラムが途中で止まってしまうのを、なんとか防ぎたい人
- ユーザーに優しい、壊れにくいアプリを作りたい人
「例外」とは何か?
プログラミングの世界で起きるトラブルには、大きく分けて2つの種類があります。
1. コンパイルエラー(書き間違い)
これは、文法が間違っているときに起きるものです。
- セミコロン
;を忘れた - 変数名のスペルが違う
- 型が合っていない これは、実行する前にエディタ(VSCodeやEclipseなど)が「ここ間違ってるよ!」と教えてくれるので、直すのは比較的簡単です。
2. 例外(実行中に起きる事故)
今回の主役がこれです。
「文法は合っているけれど、動かしてみたら予期せぬことが起きた」という状態です。
これを料理のレシピに例えると分かりやすいですよ。
- コンパイルエラー: レシピに「卵をうまる(割る)」と誤字がある状態。作る前に「え、何これ?」と気づけます。
- 例外(実行時): レシピ通りに「卵を割る」と書いてある。でも、いざ作ろうとしたら「冷蔵庫に卵がなかった(在庫なし)」とか「割ったら腐っていた(不良品)」という状態。
放置するとどうなる?
もしこの「例外」をそのままにしておくと、プログラムは「もう無理!パニック!」となって、その瞬間に強制終了してしまいます。
現実のアプリで、ボタンを押した瞬間に画面が真っ暗になってアプリが落ちたら、ユーザーの人たちは困ってしまいますよね。
だからこそ、「もし卵がなかったら、コンビニに買いに行く」とか「隣の人に借りる」といった『代わりの手順』をあらかじめ書いておく必要があるんです。
それが「例外処理」の役割です。
try-catchの基本形
「もし事故が起きたらどうしよう…」と不安な場所に、あらかじめ保険をかけておく書き方です。3つのキーワードで構成されています。
try {
// 1. とりあえずやってみる(事故が起きそうな処理)
// 例:卵を割る
} catch (Exception e) {
// 2. もしダメだったら、こう対処する(事故が起きた時の処理)
// 例:予備の卵を出す、または「卵がないよ!」と報告する
} finally {
// 3. 成功しても失敗しても、最後に必ずやる(後片付け)
// 例:キッチンの電気を消す
}それぞれの役割を詳しく!
- tryブロック: 「ここ、もしかしたらエラーが出るかも?」というコードをこの中に閉じ込めます。エラーが起きなければ、そのまま次の処理へ進みます。
- catchブロック: もし
tryの中でエラー(例外)が発生したら、プログラムを止めずにここへジャンプします。ここで「エラーメッセージを出す」「別の方法を試す」といったリカバリーを行います。 - finallyブロック: これは「あってもなくてもOK」ですが、何があっても絶対に実行される場所です。例えば「ファイルを開きっぱなしにしない」とか「データベースとの接続を切る」といった、後始末によく使われます。
「e」って何者?
catch (Exception e) の e は、「何が原因でエラーになったのか」という情報が詰まった手紙のようなものです。
e.getMessage() と書けば、「0で割り算しましたよ」といった具体的な理由を教えてくれます。
具体例:RPGのダメージ計算
例えば、モンスターへのダメージを計算するプログラムを考えてみましょう。
もし、何かのバグで「守備力が0」になっていたり、入力ミスで「数字じゃないもの」が送られてきたらどうなるでしょうか?
例外処理がない危ないコード
int damage = 100 / defense; // もし defense が 0 だったら…
System.out.println(damage + "のダメージ!");
// ここでプログラムが強制終了!「勝利演出」までたどり着けない…try-catch で守られたコード
これを try-catch で囲むと、たとえ計算に失敗してもゲームを続行できます。
try {
// 事故が起きそうな計算
int damage = 100 / defense;
System.out.println(damage + "のダメージ!");
} catch (ArithmeticException e) {
// 0で割り算(算術エラー)が起きた時の対処
System.out.println("【警告】守備力が不正です!ミス扱いになります。");
System.out.println("原因: " + e.getMessage());
} finally {
// 成功しても失敗しても、ターンは終了させる
System.out.println("ターンを終了します。");
}- ゲームが落ちない: 0で割るというミスが起きても、エラーメッセージを出して次の処理(敵のターンなど)へ安全に進めます。
- 原因がわかる:
e.getMessage()を見ることで、「なぜ今ミスになったのか」を開発者が後から調査しやすくなります。
実際の開発では、「ネットワークが繋がらない」「ファイルが壊れている」といった、自分のコードは正しくても防げない外的な事故がよく起きます。
そんな時に try-catch という「保険」があなたとユーザーを救ってくれるんです。
まとめ:エラーは「敵」じゃない
今回は、プログラムの強制終了を防ぐ最強の盾、「例外処理(try-catch)」について学びました。
大事なポイントを振り返ってみましょう。
- 例外(Exception)は事故: 文法ミスではなく、動かした後に起きる「卵がない!」という不測の事態。
- try-catchは保険: 事故が起きそうな場所に「もしダメならこうする」という予備プランを立てておくこと。
- finallyは後片付け: 成功しても失敗しても、最後に必ずやるべきことを書く場所。
エラーはプログラムからの「SOS」
初心者の頃は、真っ赤なエラー画面を見ると「自分は才能がないのかな…」なんて落ち込んでしまうこともあるかもしれません。
でも、実は逆なんです。 エラーはプログラムが「このままだと壊れちゃうから、なんとかして!」と必死にあなたに送っているメッセージ。
いわば、より良いシステムにするためのヒントなんです。
今回学んだ try-catch を使いこなせれば、エラーを怖がる必要はありません。
むしろ「想定内のトラブル」として冷静に受け流し、ユーザーを不安にさせない優しいアプリを作れるようになります。
完璧なコードを書くことよりも、「何が起きても止まらない、粘り強いコード」を書けるエンジニアを目指していきましょう!
今回も最後まで読んでいただき、ありがとうございました!
