こんにちは、かつコーチです。
学習用のコンソールアプリで「ユーザーに数値を入力してもらいたい」と思ったとき、何を使えばいいか分からなかった経験はありませんか。
今回はJavaでキーボード入力を受け取るための標準クラスScanner(入力を1つずつ読み取るためのクラス)の基本を解説します。
Scannerとは?
なぜScannerが必要なのか
Javaのプログラムはデフォルトでは画面に出力するだけで、ユーザーからの入力を受け取る仕組みは自分で用意する必要があります。System.in(標準入力を表すオブジェクト)はそのままでは扱いにくいバイトの流れでしかないため、Scannerでラップして「文字列」「数値」として簡単に読み取れるようにします。
Scannerの基本的な使い方の流れ
new Scanner(System.in)でScannerのインスタンスを作るnext〇〇()系のメソッドで入力を読み取る- 使い終わったら
close()で閉じる
この3ステップがScannerを使う基本パターンです。
基本の書き方
文字列・数値の入力を受け取る
import java.util.Scanner;
public class ScannerSample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("名前を入力してください: ");
String name = scanner.nextLine();
System.out.print("年齢を入力してください: ");
int age = scanner.nextInt();
System.out.println(name + "さんは" + age + "歳です。");
scanner.close();
}
}
nextLine()は1行分の文字列を、nextInt()は整数値を読み取ります。
入力後にScannerはclose()で必ず閉じ、リソースを解放する習慣をつけましょう。
複数の型の入力メソッド
nextLine():1行分の文字列を読み取るnextInt():整数(int)を読み取るnextDouble():小数(double)を読み取るhasNext()/hasNextInt():次の入力があるか・整数として読めるかを事前に確認する
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("価格を入力してください: ");
double price = scanner.nextDouble();
System.out.println("税込み価格: " + (price * 1.1));
scanner.close();
用途に応じて読み取りメソッドを使い分けることで、想定した型で値を受け取れます。
よくあるつまずきポイント・エラー対処
nextInt()の後にnextLine()を呼んで空文字になった
実際に私が初めてScannerを使ったときにハマった、有名なつまずきポイントです。
// ❌Before:nextInt()の直後にnextLine()を呼ぶと空文字が読まれる
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("年齢を入力してください: ");
int age = scanner.nextInt();
System.out.print("コメントを入力してください: ");
String comment = scanner.nextLine(); // 何も入力していないのにここで止まらない
System.out.println("年齢: " + age);
System.out.println("コメント: " + comment); // 空文字になる
このコードはnextInt()が数値だけを読み取り、入力時に押した改行文字をバッファに残してしまうため、直後のnextLine()がその残った改行を読み取って空文字を返す、という動きになります。
「コメントの入力を促したのにスキップされたように見える」という現象の正体はこれです。
// ✅After:nextInt()の後に余分なnextLine()を1回挟んで改行を読み捨てる
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("年齢を入力してください: ");
int age = scanner.nextInt();
scanner.nextLine(); // 残っている改行を読み捨てる
System.out.print("コメントを入力してください: ");
String comment = scanner.nextLine();
System.out.println("年齢: " + age);
System.out.println("コメント: " + comment);
数値系のnext〇〇()メソッドとnextLine()を混在させるときは、この改行の読み捨てを意識しておくとハマりにくくなります。
応用・一歩先の使い方
入力値のバリデーション(hasNextIntとの組み合わせ)
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("数値を入力してください: ");
while (!scanner.hasNextInt()) {
System.out.println("数値ではありません。もう一度入力してください。");
scanner.next(); // 不正な入力を読み飛ばす
}
int number = scanner.nextInt();
System.out.println("入力された数値: " + number);
hasNextInt()で「次の入力が整数として読めるか」を事前にチェックすることで、InputMismatchExceptionを発生させずにバリデーションできます。
複数行のまとまった入力を処理する
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.println("終了するには「終了」と入力してください。");
while (true) {
String line = scanner.nextLine();
if (line.equals("終了")) {
break;
}
System.out.println("受け取った内容: " + line);
}
scanner.close();
whileループと組み合わせることで、ユーザーが特定の文字列を入力するまで繰り返し受け付ける簡易的なコンソールアプリが作れます。
まとめ
この記事のポイント
ScannerはSystem.inをラップして文字列・数値を扱いやすくするクラスnextLine()・nextInt()・nextDouble()など用途に応じたメソッドがあるnextInt()の後にnextLine()を呼ぶと改行が残って空文字になる点に注意するhasNextInt()などで事前チェックすると入力値のバリデーションができる
次に読むべき記事
- 正規表現(Pattern・Matcher)
- java.timeで日付時刻を扱う
タグ: Java, 初心者向け, 標準ライブラリ