【6日でできるJava入門】キーボード入力から正しい回答を得る

ユーザーからの正しい入力値を得ることは、Javaプログラムで非常に重要な要素です。
 特に選択肢から番号で答えるクイズやアンケートでは、キーボードから入力された値が有効な選択肢の範囲内かどうかを確実に判定する処理が求められます。
 ここでは、「キーボード入力から正しい回答だけを受け付ける仕組みと実装方法」を、サンプルプログラム付きで分かりやすく解説します。

1.キーボード入力の取得と回答番号の抽出

1.1. ユーザー入力の特徴と課題

課題例内容例
複数文字の入力[1][2][4][Enter] のように複数の数字を入力
想定外の値(範囲外・数字以外)0や5、a、@などの誤入力
改行・余計なスペース" 1 "や"2\n"など余分な文字が含まれる

正しい回答のみ受け付けるためには、次のステップで処理を行います。

1.2. 入力値から「最初の1文字」だけを抜き出す

  1. 入力された複数文字から最初の1文字を取り出す。
  2. それを数値(int型)に変換する。
  3. 有効な範囲(例:1〜4)かどうか判定する。

2.入力チェックのサンプルプログラム

2.1. 標準入力から範囲内の回答番号を取得

ここではSystem.in.read()を使い、最初の1文字だけを回答とみなす方式で解説します。

ファイル名: lesson19_1.java

public class lesson19_1 {
    public static void main(String[] args) throws Exception {
        int maxChoice = 4; // 選択肢の最大番号
        int answer;

        while (true) {
            System.out.print("回答番号を入力してください (1~" + maxChoice + "): ");
            byte[] buffer = new byte[128];
            System.in.read(buffer);
            String input = new String(buffer).trim();

            // 最初の1文字だけ使う
            String firstChar = input.substring(0, 1);

            // 数値変換と例外処理
            try {
                answer = Integer.parseInt(firstChar);
            } catch (NumberFormatException e) {
                System.out.println("数字を入力してください。");
                continue;
            }

            // 範囲チェック
            if (answer >= 1 && answer <= maxChoice) {
                break; // 正しい番号
            } else {
                System.out.println("1~" + maxChoice + "の範囲で入力してください。");
            }
        }
        System.out.println("選択された回答番号は " + answer + " です。");
    }
}

実行結果

回答番号を入力してください (1~4): 7
1~4の範囲で入力してください。
回答番号を入力してください (1~4): a
数字を入力してください。
回答番号を入力してください (1~4): 2
選択された回答番号は 2 です。

2.2. 解説(ポイント)

ステップ役割
byte配列で入力複数の文字入力やEnterも格納される。
文字列へ変換(trimつき)前後の空白や改行を除去
substring(0, 1)先頭1文字だけ抽出
Integer.parseInt()文字列を整数に変換
例外(NumberFormatException)数字以外が入力された時も安全
if文で範囲チェック正しい番号ならbreakでループ終了
誤入力時は再入力を促すcontinueで再度入力受付

3.変数のスコープと宣言位置

3.1. 変数のスコープとは

変数は、宣言したブロック内だけで有効です。whileやifなどの内側で宣言した変数は外側では使えません。

変数名宣言ブロック有効範囲
totalmainメソッド内mainメソッド内全域
squareforループ内forループ内

3.2. スコープの具体例

ファイル名: lesson19_2.java

public class lesson19_2 {
    public static void main(String[] args) {
        int total = 0; // mainの全域で使える

        for (int i = 1; i <= 5; i++) {
            int square = i * i; // for文の中だけ有効
            total += square;
            System.out.println(i + "の2乗は " + square);
        }
        System.out.println("合計=" + total);
        // System.out.println(square); // これはエラーになる
    }
}

実行結果

1の2乗は 1
2の2乗は 4
3の2乗は 9
4の2乗は 16
5の2乗は 25
合計=55

まとめ

  • キーボードからの入力値は、そのまま使わず「必要な文字だけ取り出して数値変換、範囲チェック」を必ず行うこと。
  • 不正入力や範囲外入力には、繰り返し再入力を促す仕組みが重要。
  • 変数スコープにも注意し、必要な範囲で正しく宣言・利用しよう。