今回やること
Scannerを使うと、コンソールへ入力された文字をJavaプログラムで読めます。今回は名前と年齢をどちらもnextLine()で読み、年齢だけ後から整数へ変換します。
前提: Java入門 #13 - コンストラクタまでを終え、文字列と変数を使えること。
キーボード入力 → Scanner.nextLine() → String → 必要なら数値へ変換
1. Scannerを作る
Scannerはjava.utilからimportします。System.inは標準入力です。
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
完成例では、入力を読み終えた最後にscanner.close()を呼びます。System.inを閉じると後から再利用できないため、アプリ全体で1つを使い、途中で何度も作り直さないようにします。
2. nextLineで1行読む
System.out.print("名前: ");
String name = scanner.nextLine();
nextLine()はEnterまでの1行を文字列として返します。空白を含む「Ada Lovelace」も1つの文字列として読めます。
年齢も最初は文字列で読みます。
System.out.print("年齢: ");
String ageText = scanner.nextLine();
入力方法をnextLine()へそろえると、「数値の直後に改行だけが残る」という混乱を避けやすくなります。
3. 数値へ変換する
int age = Integer.parseInt(ageText);
"16"は整数16へ変換できますが、"sixteen"や空文字は変換できずNumberFormatExceptionになります。
今回は入力を読む流れに集中するため、数値以外を入力すると例外が表示されてプログラムは終了します。失敗を安全に処理する方法は#19 - 例外処理の基本で学びます。
完成コードを動かす
ScannerDemo.javaとして保存します。
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("名前: ");
String name = scanner.nextLine();
System.out.print("年齢: ");
String ageText = scanner.nextLine();
int age = Integer.parseInt(ageText);
System.out.println(name + "さんは" + age + "歳です");
scanner.close();
}
}
javac ScannerDemo.java
java ScannerDemo
表示された順に名前、年齢、Enterを入力します。
成功確認
Adaと16を入力した場合、最後に次が表示されれば成功です。
Adaさんは16歳です
年齢へabcを入力した場合はNumberFormatExceptionが表示されて終了します。この段階では想定どおりの失敗です。
nextInt後に改行が残る問題
nextInt()は整数だけを読み、Enterの改行を残します。その直後のnextLine()は残った改行を読み、空文字になることがあります。
int age = scanner.nextInt();
scanner.nextLine(); // 残った改行を読み捨てる
String name = scanner.nextLine();
この対処もできますが、初学者は完成例のようにすべてnextLine()で読み、必要な値だけ変換すると入力の流れを追いやすくなります。
よくあるつまずき
何も入力していないように見える
nextInt()の後なら、残った改行をnextLine()が読んだ可能性があります。入力メソッドの混在を確認します。
数字以外でプログラムが落ちる
Integer.parseIntは変換できない文字列でNumberFormatExceptionを投げます。まず整数を入力して完成コードを確認し、例外の処理は#19で追加します。
Scannerを毎回作る
同じSystem.inに複数のScannerを作ると入力管理が複雑になります。1つを必要な処理へ渡します。
練習
商品名と個数を2行で読み、個数をInteger.parseIntで変換して「ノートを3個」のように表示してください。最初は整数だけを入力します。
次のステップ
Java入門 #15 - ArrayListで、入力された値を後から追加できるリストへ保存します。
入力失敗時の処理は、Java入門 #19 - 例外処理の基本で学びます。