1. なぜ try-catch が必要か?
ご存じのとおり、プログラミングではエラーは頻繁に起こります。ゼロ除算、不正な入力、ファイルの不在などです。こうした状況を処理しないと、プログラムはエラーで(異常)終了します。
構文 try-catch は例外を「捕まえて」プログラムのクラッシュを防ぎ、エラーを丁寧に処理できます。
try-catch 構文のシンタックス
try
{
// 例外をスローする可能性のあるコード
}
catch (TipIsklyucheniya imyaPeremennoy)
{
// 例外を処理するコード
}
説明:
- try — 「このコードの実行を試みる」。
- catch — 「指定の型の例外が発生したら、ここで処理する」。
どのように動作するか?
try ブロック内で例外が発生すると、そのブロックの実行は直ちに中断され、最初に一致する catch ブロックに制御が移ります。例外が発生しなければ、catch ブロックはスキップされます。
2. 例: ゼロによる除算
例外処理なし
int a = 10;
int b = 0;
int result = a / b; // ここでプログラムはエラー終了!
System.out.println("結果: " + result); // ここには到達しない
結果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:3)
try-catch で処理する場合
int a = 10;
int b = 0;
try
{
int result = a / b; // ここで例外が発生する可能性がある
System.out.println("結果: " + result);
}
catch (ArithmeticException e)
{
System.out.println("エラー: 0 で割ることはできません!");
}
System.out.println("プログラムは処理を続行しました。");
結果:
エラー: 0 で割ることはできません!
プログラムは処理を続行しました。
説明:
- Java がゼロ除算に出会うと、ただちに例外を「スロー」します。
- try は中断され、制御は catch に移ります.
- エラーを処理した後、プログラムは実行を続けます。
3. catch ブロックはどう動くか
catch の後ろの括弧には、例外の型(例: ArithmeticException)と変数名(一般に e)を指定します。
catch ブロックの内部では、エラーの詳細を知ることができます:
- e.getMessage() — エラーの短い説明。
- e.printStackTrace() — 詳細情報(デバッグ用)。
例:
try
{
int[] arr = new int[2];
int x = arr[10]; // エラー: そのインデックスは存在しない
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("エラー: " + e.getMessage()); // エラーメッセージを出力
e.printStackTrace(); // エラーの詳細をコンソールに出力
}
4. 例外発生時の実行フロー
try ブロックにエラーがない場合、catch ブロックはスキップされます。
try ブロックでエラーが発生した場合、エラーの箇所で実行が中断され、ただちに最初に一致する catch に制御が移ります。エラー以降の try 内の処理は実行されません!
例:
try
{
System.out.println("1. try の開始");
int a = 10 / 0; // エラー!
System.out.println("2. 割り算の後"); // 実行されない
}
catch (ArithmeticException e)
{
System.out.println("3. catch ブロック内");
}
System.out.println("4. try-catch の後");
結果:
1. try の開始
3. catch ブロック内
4. try-catch の後
5. try-catch の使い方でよくあるミス
誤り № 1: catch が広すぎる。
catch (Exception e) を使うと、適切に処理できない多数の予期しないエラーまで捕捉してしまいます。
解決策: その場で現実的に想定される例外だけを捕捉する(例: IOException、SQLException)。
誤り № 2: 空の catch。
catch (Exception e) {} と書くのは問題を隠すことです。プログラムは別の場所で落ちるか、奇妙な挙動になります。
解決策: 少なくともエラーをログに残す(e.printStackTrace() またはロガー)。
誤り № 3: try-catch でどんな問題でも直せると信じること。
プログラムのロジックの誤り(例: ゼロ除算、誤ったアルゴリズム)の場合、どんな try-catch でも助けにはなりません。
解決策: try-catch は本当に想定される状況にのみ使い、バグの隠蔽には使わない。
GO TO FULL VERSION