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

正しい入力だけを受け取れるようになると、Javaのプログラムはぐっと頼もしくなる。入力チェックを身につけて、ミスに強い処理を作ろう

Javaでキーボード入力を扱えるようになると、プログラムは外の世界とやり取りできるようになります。けれど、ただ入力を受け取れるだけではまだ十分ではありません。大切なのは、その入力が 本当に使ってよい値かどうか をきちんと確認することです。たとえば、選択肢が 1 から 4 までしかないのに 7 が入力されたり、数字を入れてほしいのに a や @ が入力されたりすると、そのままでは正しく処理を進められません。

ドラゴンボールの世界でたとえるなら、師匠が 技を1から4の番号で答えなさい と指示したのに、弟子が 7 や a と答えてしまうようなものです。そのまま修行を進めると、教える側も受ける側も混乱してしまいます。だからこそ、正しい番号だけを受け付けて、違っていたらもう一度たずねる仕組みが必要になります。

この記事では、キーボード入力から正しい回答番号だけを取り出す考え方と、その実装方法を丁寧に解説します。さらに、入力処理の中でとても大事になる 変数のスコープ についても整理します。例示するプログラムは Lesson19_1.java と Lesson19_2.java のみを使い、入力値の検査と変数の有効範囲をしっかり押さえていきます。ここを理解すると、Javaのプログラムが ただ入力を受け取るだけでなく、安全に使える入力だけを選び取る ようになります。

なぜ正しい入力だけを受け取る必要があるのか

ユーザー入力は、プログラムの外から入ってくる情報です。そのため、いつも想定通りとは限りません。数値を入れてほしいのに文字が入ることもありますし、選択肢の範囲外の番号が入力されることもあります。だから、受け取った値をそのまま使うのではなく、まず確認する必要があります。

入力時によくある問題

課題例内容例
複数文字の入力124 のように複数の数字を入れる
範囲外の値0 や 5 など、選択肢にない番号を入れる
数字以外の入力a、@、空文字などが入る
余計な空白や改行1 や 2 の前後に空白が混ざる

ドラゴンボール風にいえば、師匠が 1から4の中で技番号を答えなさい と言っているのに、弟子が余計な言葉を混ぜたり、存在しない番号を答えたりする状態です。これをきちんと整えないと、次の修行処理へ安全に進めません。

正しい回答を得るための流れ

正しい入力だけを受け付けるには、いくつかの段階を踏む必要があります。順番を整理すると、次のようになります。

入力チェックの基本手順

手順内容
1キーボードから入力を受け取る
2不要な空白や改行を取り除く
3必要な文字だけを取り出す
4数値に変換する
5範囲内かどうか確認する
6不正なら再入力を求める

この流れをきちんと作ることで、プログラムは 間違った入力で壊れにくい ものになります。

最初の1文字だけを使う考え方

入力された値が複数文字だった場合でも、選択肢番号として使いたいのは先頭の1文字だけ、という場面があります。たとえば 124 と入力されても、最初の 1 だけを回答として見るような考え方です。

ドラゴンボール風にたとえるなら、弟子が長く答えてしまっても、師匠は 最初に言った技番号 だけを受け取るようなイメージです。

この方法を使うと、少なくとも先頭の1文字を取り出して、それが数字として正しいかを確認できます。

正しい回答番号を受け取るプログラム

ここでは、System.in.read() を使って、1から4までの正しい番号だけを受け付ける例を見ていきます。

ファイル名: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 です。

このプログラムでは、正しい番号が入るまで while (true) で繰り返し入力を受け付けています。そして、正しい入力が確認できたら break でループを抜けています。

Lesson19_1.java の処理を順番に見る

このプログラムには、入力チェックの大事な考え方がたくさん入っています。順番に見ていきます。

1. 無限ループで再入力を受け付ける

while (true) {

この while は、正しい入力が入るまで何度でも繰り返すために使っています。条件を満たしたら break で抜ける構造です。

ドラゴンボール風にいえば、師匠が 正しい技番号を答えるまで質問を続ける 状態です。

2. 入力用の配列を作る

byte[] buffer = new byte[128];

これは入力データを受け取るための箱です。System.in.read() で読み込んだ内容がここへ入ります。

3. 入力を読み込んで文字列へ変換する

System.in.read(buffer);
String input = new String(buffer).trim();

ここでは、キーボードからの入力を byte配列へ入れ、それを String に変換しています。さらに trim() で前後の空白や改行を取り除いています。

4. 最初の1文字を取り出す

String firstChar = input.substring(0, 1);

ここで入力された文字列の先頭1文字だけを取り出しています。たとえば 124 と入力されても、1 だけを使います。

5. 数値へ変換する

answer = Integer.parseInt(firstChar);

先頭1文字を int に変換しています。ただし、数字以外だと変換できないため、try-catch が必要です。

6. 数字でなければ再入力

catch (NumberFormatException e) {
    System.out.println("数字で入力してください。");
    continue;
}

もし a や @ のような入力だった場合は、NumberFormatException が発生します。そのときはメッセージを出して continue で次の入力へ進みます。

7. 範囲内かどうかを確認する

if (answer >= 1 && answer <= maxChoice) {
    break;
} else {
    System.out.println("1~" + maxChoice + "の範囲で入力してください。");
}

ここで 1 から 4 の範囲に入っているかを確認しています。範囲内なら break で終了、範囲外なら再入力を求めます。

入力チェックのポイントを表で整理

Lesson19_1.java の重要ポイント

ステップ役割
byte配列で入力複数文字や改行もまとめて受け取る
trim()前後の空白や改行を除去する
substring(0, 1)先頭1文字だけを抜き出す
Integer.parseInt()数値へ変換する
try-catch数字以外が入ったときに安全に対応する
範囲チェック1~4の中だけを有効にする
continue不正入力時に再入力へ進む
break正しい入力が来たらループを終える

この流れを理解すると、入力値を 安全に受け取って使う ための基本がかなり見えてきます。

変数のスコープとは何か

入力処理を考えるときにもうひとつ大事なのが、変数のスコープです。スコープとは、その変数が どこで使えるか という範囲のことです。

変数は、宣言した場所によって使える範囲が決まります。外側で宣言した変数は内側でも使えることがありますが、内側で宣言した変数は外側では使えません。

ドラゴンボール風にたとえるなら、修行場全体で使える記録札もあれば、その場限りの一時メモもあります。どこで書いたかによって、使える範囲が決まるわけです。

スコープを理解するための例

ここでは、入力処理そのものではありませんが、変数の有効範囲を理解するための例として、合計と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 + "段目の修行値は " + square);
        }

        System.out.println("合計修行値 = " + total);
        // System.out.println(square); // これはエラーになる
    }
}

実行結果

1段目の修行値は 1
2段目の修行値は 4
3段目の修行値は 9
4段目の修行値は 16
5段目の修行値は 25
合計修行値 = 55

このプログラムでは、total は main メソッドの中で宣言しているので、for文の外でも内でも使えます。一方で square は for文の中で宣言しているので、for文の外へ出たら使えません。

スコープを表で整理する

変数のスコープの例

変数名宣言ブロック有効範囲
totalmainメソッド内mainメソッド内全体
ifor文の初期化部分そのfor文の中
squarefor文の中そのfor文の中だけ

この表から分かるように、変数は どこで宣言したか で有効範囲が決まります。

入力処理とスコープの関係

Lesson19_1.java でも、answer を while文の外で宣言しているのには意味があります。

int answer;

もし answer を while の中で宣言してしまうと、ループを抜けたあとで

System.out.println("選ばれた技番号は " + answer + " です。");

のように使えなくなってしまいます。

つまり、ループの外でも使いたい変数は外で宣言し、その場限りでよい変数は内側で宣言する、という考え方が大切です。

入力処理でのスコープの考え方

変数外で宣言する理由
answerループ終了後にも表示したいから
bufferその回の入力だけに使うので内側でよい
inputその回の入力チェックだけに使うので内側でよい

このように、スコープを意識すると、変数をどこへ置けばよいかが整理しやすくなります。

正しい回答を得る流れを図で整理

入力チェックは、受け取って終わりではなく、確認して再入力を促す流れが大切です。

下図は、キーボード入力を受け取ったあと、先頭1文字の抽出、数値変換、範囲チェックという順番で判定を進め、正しい入力なら終了、不正な入力なら再入力へ戻る流れを示したものです。入力の確認が段階的に行われていることが分かります。

↓クリックすると拡大表示されます。

この図が示していること

この図は、入力された値をそのまま使うのではなく、先頭文字の抽出、数値変換、範囲確認という段階を通して、正しい回答だけを選び取っていることを示しています。

この図から分かること

この図を見ると、正しい入力を得るには いきなり使う のではなく、確認しながら進める必要があることが分かります。再入力の流れがあることで、不正な値にも対応できることが見えてきます。

スコープの違いを図で整理

変数のスコープも図にすると、とても理解しやすくなります。どの変数が広い範囲で使えて、どの変数が内側だけなのかが見えるからです。

下図は、mainメソッド全体を大きな枠、for文やwhile文の内部を小さな枠として描き、外側で宣言した変数 total や answer は広い範囲で使え、内側で宣言した square や input はその小さな枠の中でしか使えないことを示したものです。スコープが 入れ子の範囲 として見えるようになっています。

↓クリックすると拡大表示されます。

この図が示していること

この図は、変数が 宣言された場所を中心に使える範囲が決まる ことを示しています。外側の変数は広く使え、内側の変数はそのブロックの中だけに限られることが表されています。

この図から分かること

この図を見ると、変数をどこで宣言するかがとても重要だと分かります。入力後にも使いたい変数は外側へ、途中だけ使う変数は内側へ置くべき理由が見えてきます。

正しい入力を得る仕組みを理解すると、プログラムがかなり安全になる

キーボード入力を受け取れるようになっても、そのまま使ってしまうと、範囲外の値や数字以外の文字で処理が乱れることがあります。だからこそ、必要な文字だけを取り出し、数値へ変換し、範囲を確認し、不正なら再入力を求める流れが大切です。

ドラゴンボールの修行でも、弟子の答えをただ受け取るだけではなく、本当に正しい技番号か、修行条件に合っているかを確認してから次へ進める必要があります。Javaの入力チェックもそれと同じで、正しい答えだけを受け付ける仕組みを作ることで、プログラムはぐっと安全で信頼できるものになります。