Java入門⑤ キーボードから入力を受け取る ── Scanner

前回は「計算する(演算子)」をやりました。

今回は、キーボードから入力を受け取る方法です。これができると、プログラムが一気に「対話」っぽくなります。Javaでは Scanner(スキャナー)という道具を使います。

これまでは「表示」だけだった

これまで、画面に文字を出す System.out.println を使ってきました。これは、プログラムから人へ出力(表示)する命令です。

今回はその逆。人からプログラムへ、入力してもらいます。

Scanner を使う準備

Javaで入力を受け取るには、Scanner という道具を使います。使うには、2つの準備が必要です。

import java.util.Scanner;   // ① ファイルの先頭に書く

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);   // ② 道具を用意

        // ここで入力を受け取れる
    }
}
  • import java.util.Scanner; … 「Scanner という道具を使います」という宣言。ファイルの先頭に書く
  • new Scanner(System.in) … キーボード用の Scanner を用意

最初は、この2行も「入力するためのおまじない」として受け入れてOKです。「入力したいときは、Scanner を用意する」と覚えておきましょう。

文字を入力してもらう

準備ができたら、入力を受け取れます。名前を聞いて、あいさつする例です。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("お名前は?");
        String name = scanner.nextLine();
        System.out.println(name + "さん、こんにちは!");
    }
}

実行すると、こうなります。

お名前は?
山田          ← ここでキーボードから入力
山田さん、こんにちは!

scanner.nextLine() が、「キーボードから1行の入力を受け取る」命令です。受け取った文字を、変数 name に入れて覚えています。

数字を入力してもらう

数字を受け取りたいときは、別の命令を使います。

System.out.println("年齢は?");
int age = scanner.nextInt();
System.out.println("あなたは" + age + "歳ですね");
  • nextLine() … 文字(String)として受け取る
  • nextInt() … 整数(int)として受け取る

受け取りたい型によって、使う命令が変わります。整数なら nextInt()、小数なら nextDouble()、文字なら nextLine()、という具合です。

つまずきポイント

Scanner には、初心者がほぼ全員はまる、有名な罠があります。nextInt()nextLine()混ぜて使うときに起きます。

int age = scanner.nextInt();      // 数字を入力
String name = scanner.nextLine(); // 名前を入力 … のはずが、飛ばされる!

nextInt() の後に nextLine() を使うと、名前を入力する前に、勝手に進んでしまうことがあります。これは、nextInt() が「改行」を残してしまうために起きる、Javaの有名なクセです。

対処法はいくつかありますが、初心者には「全部 nextLine() で受け取って、数字は後から変換する」のがいちばん分かりやすいです。

System.out.println("年齢は?");
String input = scanner.nextLine();          // まず文字として受け取る
int age = Integer.parseInt(input);          // 整数に変換する

Integer.parseInt(...) は「文字列を整数に変換する」命令です。前回までの「数字の100」と「文字の"100"」は別物、という話を思い出してください。入力された "20" は文字なので、計算に使うには整数の 20 に変換するわけです。

このやり方なら、あの厄介な罠を避けられます。最初は「入力は全部 nextLine、数字は parseInt で変換」と覚えておくと、トラブルが減ります。

まとめ

  • 入力には Scanner を使う(importnew Scanner(System.in) が準備)
  • 文字は nextLine()、整数は nextInt()
  • nextInt()nextLine() を混ぜると、飛ばされる罠がある
  • 初心者は「全部 nextLine で受け取り、数字は Integer.parseInt() で変換」が安全

次回は、条件によって動きを変える if文 です。今回の入力と組み合わせると、ぐっとプログラムらしくなります。