この記事で学べる知識:エラーメッセージ
この記事の練習問題で使用する知識:
基礎構文(レッスン1)、比較演算子と論理演算子、分岐処理(if文)、分岐処理(switch文)、繰り返し処理(for文)、繰り返し処理(while文)、繰り返しの制御、配列、エラーメッセージ、例外処理の基礎
<<前のページ | 問題集Top |
次のページ>> |
JAVAの文法「例外処理」とは
ここでは例外処理の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。
今回は例外処理(Exception Handling)について解説します。
プログラムを実行しているとき、予期せぬエラーが発生することがあります。例えば、ファイルが見つからなかったり、数値をゼロで割ってしまったりといったエラーです。
こういったエラーが起きたとき、プログラムが途中で止まってしまうのではなく、エラーに対処し、適切な処理を行うために例外処理が使われます。
例外とは何か?
例外(Exception)とは、プログラムの実行中に発生する予期しない問題やエラーのことです。
例外が発生するとプログラムは通常の処理を中断し、そのエラーにどう対処するかが必要になります。
例外が処理されないとプログラムはクラッシュしてしまいます。
例外が発生する主な状況
- ファイルが見つからない(
FileNotFoundException
) - 配列の範囲外のインデックスにアクセスした(
ArrayIndexOutOfBoundsException
) - 0で割り算をした(
ArithmeticException
)
例外処理の基本構文
JAVAでは例外を処理するためにtry-catch構文を使用します。
これによりエラーが発生した場合にプログラムをクラッシュさせることなく、適切に対処することができます。
try { // 例外が発生するかもしれない処理 } catch (例外の種類 例外変数) { // 例外が発生した場合の処理 }
例:ゼロ除算エラーの例外処理
次の例では数値をゼロで割った際に発生する ArithmeticException
を処理しています。
public class Main { public static void main(String[] args) { try { int result = 10 / 0; // ここで例外が発生 System.out.println("Result: " + result); } catch (ArithmeticException e) { System.out.println("エラー: 0で割り算をすることはできません"); } } }
このコードを実行すると以下のように出力されます。
エラー: 0で割り算をすることはできません
上記のコードではtry
ブロック内で 10 を 0 で割ろうとしています。
これはエラー(例外)を引き起こしますが、catch
ブロックでそのエラーを捕まえて適切なエラーメッセージを表示しています。
このように例外が発生してもプログラムが止まらず、正しく動作することが重要です。
複数の例外を処理する
プログラムの中で複数の異なる例外が発生する可能性があります。
その場合、各例外に対して異なる catch
ブロックを使って対処できます。
public class Main { public static void main(String[] args) { try { int[] numbers = {1, 2, 3}; System.out.println(numbers[5]); // 配列の範囲外アクセス int result = 10 / 0; // 0での割り算 } catch (ArrayIndexOutOfBoundsException e) { System.out.println("エラー: 配列の範囲外にアクセスしました"); } catch (ArithmeticException e) { System.out.println("エラー: 0で割り算をすることはできません"); } } }
このコードを実行すると以下のように出力されます。
エラー: 配列の範囲外にアクセスしました
この例ではまず配列の範囲外にアクセスするエラー ArrayIndexOutOfBoundsException
が発生します。
try
ブロックの中で例外が発生すると、catch
ブロックに移動してエラーメッセージを表示します。
複数の catch
ブロックを使うことで、発生したエラーの種類に応じて異なる処理を行うことができます。
finallyブロック
try-catch
構文にはオプションでfinallyブロックを追加することができます。
finally
ブロックに書かれた処理は、例外が発生したかどうかに関わらず、必ず実行されます。
通常、リソースの解放や後処理を行うために使用されます。
public class Main { public static void main(String[] args) { try { int result = 10 / 0; } catch (ArithmeticException e) { System.out.println("エラー: 0で割り算をすることはできません"); } finally { System.out.println("処理終了後に必ず実行されます"); } } }
このコードを実行すると以下のように出力されます。
エラー: 0で割り算をすることはできません 処理終了後に必ず実行されます
finally
ブロックは例外が発生しても必ず実行されるため、たとえばファイルやネットワークリソースのクローズ処理を行う場合に便利です。
まとめ
- 例外処理は、プログラムがエラーを適切に処理するための重要な仕組みです。
try-catch
構文を使うことで、例外が発生してもプログラムを停止させずに処理を続行できます。- 複数の例外を
catch
ブロックで処理し、異なる種類のエラーに対して適切な対応が可能です。 - finallyブロックを使うと、例外が発生しても必ず実行したい処理を記述できます。
例外処理はエラーの発生を予測して、プログラムが正しく動作し続けるために非常に重要な技術です。
実際にコーディングする際にも、適切な例外処理を行う習慣をつけましょう。
JAVA練習問題2-9:整数入力プログラムでエラーハンドリングをしてみよう
ユーザーに整数の入力を求め、入力された整数を表示するプログラムを作成してください。
ユーザーが整数以外の値を入力した場合にはエラーメッセージを表示し、プログラムの終了を通知します。
また
すべての操作が終わった際にリソースを解放するようにします。
このプログラムを通して、例外処理の基本的な使い方を学びましょう。
この問題の要件
以下の要件に従ってプログラムを作成して下さい。
Scanner
クラスを使い、ユーザーから整数を入力させること。- ユーザーが入力した内容を整数として取得し、その値を表示すること。
- 整数以外が入力された場合は、
Exception
をキャッチして「エラー: 整数を入力してください。」というエラーメッセージを表示すること。 try-catch
ブロックの最後に「プログラムを終了します。」と表示すること。finally
ブロックでScanner
のリソースを解放すること。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
整数を入力してください:abc エラー: 整数を入力してください。 プログラムを終了します。
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // ユーザーに整数の入力を求める System.out.print("整数を入力してください:"); try { // 入力を整数として読み取る int number = scanner.nextInt(); // 入力が成功した場合に表示するメッセージ System.out.println("入力された整数は " + number + " です。"); } catch (Exception e) { // 例外が発生した場合のメッセージ System.out.println("エラー: 整数を入力してください。"); } finally { // try-catch ブロックの終了を知らせる System.out.println("プログラムを終了します。"); // リソースの解放 scanner.close(); } } }
コードの解説
このJavaコードはユーザーから整数を入力してもらい、正しく入力された場合はその整数を表示し、誤って整数以外の入力があった場合にエラーメッセージを出すように設計されています。
このコードを通じてJavaにおける例外処理の基本を学びましょう。
インポート文の導入
import java.util.Scanner;
最初にJavaのScanner
クラスをインポートしています。
このクラスはユーザーからの入力を受け取るために使用されます。
クラスとメインメソッドの定義
public class Main { public static void main(String[] args) {
Main
というクラスを定義し、その中でmain
メソッドを定義しています。
main
メソッドはJavaプログラムのエントリーポイントであり、プログラムを実行するとここからコードが開始されます。
Scannerオブジェクトの初期化
Scanner scanner = new Scanner(System.in);
Scanner
オブジェクトを作成し、標準入力(通常はキーボード)からユーザー入力を受け取る準備をしています。
このscanner
オブジェクトを使用してユーザーからの入力を読み取ります。
ユーザーへの入力指示
System.out.print("整数を入力してください:");
この行はユーザーに「整数を入力してください:」というメッセージを表示し、入力を待機する状態にします。
tryブロックでの例外処理の開始
try { int number = scanner.nextInt(); System.out.println("入力された整数は " + number + " です。"); }
この部分ではtry
ブロックを使用して、ユーザーが入力したデータを整数として読み取ります。
具体的にはscanner.nextInt()
メソッドを使って、ユーザーが入力した値をint
型の変数number
に格納し、読み取りが成功した場合にはその値を表示します。
try
ブロックは「エラーが発生し得る処理」を囲むために使用します。
catchブロックでのエラー処理
} catch (Exception e) { System.out.println("エラー: 整数を入力してください。"); }
もしユーザーが整数以外の値(例えば文字列や記号)を入力すると、scanner.nextInt()
でエラー(例外)が発生します。
この場合catch
ブロックが実行され、「エラー: 整数を入力してください。」というメッセージが表示されます。
これが例外処理で、try
ブロックでエラーが発生した際に、catch
ブロックでエラーメッセージを表示してプログラムが異常終了しないようにします。
finallyブロックでの後処理
} finally { System.out.println("プログラムを終了します。"); scanner.close(); }
finally
ブロックはtry
やcatch
ブロックの処理が終わった後に必ず実行される部分です。
ここでは「プログラムを終了します。」というメッセージを表示し、最後にscanner.close()
でScanner
オブジェクトを閉じています。
リソースの解放はプログラムの健全な動作を保つために重要です。
まとめ
このコードでは例外処理の基礎であるtry-catch-finally
構文を使い、ユーザーからの入力に対してエラーが発生してもプログラムが正常に終了する方法を学びました。
例外処理はプログラムの予期しないエラーに対処するための重要な仕組みです。
これを理解し、使いこなせるようになると、より安定したプログラムを作成することができるようになります。
ぜひ実践で活用してみてください!
<<前のページ |
問題集Top |
次のページ>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。