【Java】Scannerでユーザー入力ができなくなるバグの解決法(Scanner.nextInt()とScanner.nextLine())

その他

こんにちは、しんです!

先日、Javaのソースコードを書いていると、奇妙なことが起きました。

Scannerを使ってユーザー入力を用いたソースコードを書いていたら、本来ユーザー入力されるべきところでユーザー入力が飛ばされてしまいました。

スポンサーリンク

バグの内容

その時のコードがこんな感じ。

public static void privacyInfo(Scanner console){
    System.out.print("Enter your first and last name separating with one space (all letters in lowercase): ");
    String name = fullname(console);
    System.out.print("Enter your phone number in the format(123 456 7890): ");
    String p_num = phone_number(console);
    System.out.print("Enter your address in the following format(6000 J street:Sacramento:CA 95819):");
    String ad = adress(console);
    System.out.print("\n\n\n\n");
    information(name, p_num, ad);
}

public static int appTimes(Scanner console){
    int num = console.nextInt();
    return num;
}

public static String fullname(Scanner console){
    return console.nextLine();
}

public static String phone_number(Scanner console){
    return console.nextLine();
}

public static String adress(Scanner console){
    return console.nextLine();
}

冗長になってしまうので、mainメソッドなどは抜いて書いてあります。コードの一部をそのまま引っ張ってきたので知らないメソッドが紛れ込んでいますが無視してください。

appTimesメソッドは、privacyInfoの呼び出し直前に実行されるものなのですが、これをこのまま実行すると、どうもユーザー入力がおかしい。

ちなみに出力はこんな感じ。

This program shows how money increases over time given a particular interest rate and a regular deposit amount.

How many times do you want to use this app: 1

Enter your first and last name separating with one space (all letters in lowercase): Enter your phone number in the format(123 456 7890):
少し見づらいですが、本来名前を入力するところで入力できずに、飛ばされてしまいました。
スポンサーリンク

意外な原因と解決方法

どうしても自力で解決できなかったので調べてみました。すると、意外な理由が明らかに。

どうやら、nextInt()を使った後にnextLine()を使うと、こういったバグが起きるようです。

理由としては、nextInt()で数値を入力したときに、改行文字(Enterキー)まで読み込まないため。なので、Enterキーを押すと、nextInt()を使った入力の次の入力の終了を意味することと同義のようです。

なので、解決方法としては

  1. nextInt()を使った後にnextLine()を空打ちして改行文字を読み込ませる
  2. nextInt()の代わりに、nextLine()を使ってユーザー入力を済ませた後、型を変換する

の二つが挙げられます。ちなみに、僕は前者を選びました。修正後のコードがこちら。(修正箇所だけ)

public static void privacyInfo(Scanner console){
    console.nextLine();
    System.out.print("Enter your first and last name separating with one space (all letters in lowercase): ");
    String name=fullname(console);
    System.out.print("Enter your phone number in the format(123 456 7890): ");
    String p_num=phone_number(console);
    System.out.print("Enter your address in the following format(6000 J street:Sacramento:CA 95819):");
    String ad=adress(console);
    System.out.print("\n\n\n\n");
    information(name, p_num, ad);
}

こんな感じで、nextInt()を使った後にただnextLine()を追加して、ただ空打ちしただけです。

スポンサーリンク

まとめ

今回はnextInt()を使った後にnextLine()を使うことで起こるバグの解決方法について紹介しました。

nextInt()以外にも、改行文字を含まないメソッドを使うと同様のバグが起きるようです。

最後までご覧いただきありがとうございました。

スポンサーリンク

参考文献

ScannerクラスのnextIntの後でnextLine()を使うと認識されない。|teratail
ある問題なのですが、標準入力で3a b c  と与えられています。abcの英数字の隙間は半角スペースで開いています。この入力をscannerで読み込むときに 1 Scanner sc = new Scanner(Sy
Scanner is skipping nextLine() after using next() or nextFoo()?
I am using the Scanner methods nextInt() and nextLine() for reading input. It looks like this: System.out.println("Enter numerical value"); int option; o...
この記事を書いた人
しん

海外留学経験あり、映画・ゲーム・旅行が大好きな大学生。留学経験を生かした英語学習や、自分の趣味をゆるく発信していくブログです。SNSはプロフィール下のボタンから!
今年の目標は基本情報技術者の取得とTOEIC800点。

しんをフォローする
スポンサーリンク
スポンサーリンク
その他
スポンサーリンク
しんともブログ

コメント

タイトルとURLをコピーしました