web-dev-qa-db-ja.com

scanner.nextLine()を使用する

Java.util.ScannerのnextLine()メソッドを使用しようとしたときに、問題が発生しました。

これが私が試したものです:

import Java.util.Scanner;

class TestRevised {
    public void menu() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter a sentence:\t");
        String sentence = scanner.nextLine();

        System.out.print("Enter an index:\t");
        int index = scanner.nextInt();

        System.out.println("\nYour sentence:\t" + sentence);
        System.out.println("Your index:\t" + index);
    }
}

例1:この例は意図したとおりに機能します。行String sentence = scanner.nextLine();は、System.out.print("Enter an index:\t");に進む前に入力が入力されるのを待ちます。

これにより出力が生成されます。

Enter a sentence:   Hello.
Enter an index: 0

Your sentence:  Hello.
Your index: 0

// Example #2
import Java.util.Scanner;

class Test {
    public void menu() {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("\nMenu Options\n");
            System.out.println("(1) - do this");
            System.out.println("(2) - quit");

            System.out.print("Please enter your selection:\t");
            int selection = scanner.nextInt();

            if (selection == 1) {
                System.out.print("Enter a sentence:\t");
                String sentence = scanner.nextLine();

                System.out.print("Enter an index:\t");
                int index = scanner.nextInt();

                System.out.println("\nYour sentence:\t" + sentence);
                System.out.println("Your index:\t" + index);
            }
            else if (selection == 2) {
                break;
            }
        }
    }
}

例2:この例は意図したとおりには動作しません。この例では、whileループとif - else構造を使用して、ユーザーが何をするかを選択できるようにします。プログラムがString sentence = scanner.nextLine();に到達すると、入力を待たずにSystem.out.print("Enter an index:\t");行を実行します。

これにより出力が生成されます。

Menu Options

(1) - do this
(2) - quit

Please enter your selection:    1
Enter a sentence:   Enter an index: 

これは文章を入力することを不可能にします。


例2が意図したとおりに機能しないのはなぜですか? Exの唯一の違い。 1と2はその例です。 2はwhileループとif-else構造を持っています。なぜこれがscanner.nextInt()の動作に影響するのか理解できません。

90
Taylor P.

あなたの問題はそれだと思います

int selection = scanner.nextInt();

行の終わりや数の後にあるものではなく、数だけを読みます。宣言したとき

String sentence = scanner.nextLine();

これは、その行の残りの部分を、その上に番号を付けて読み取ります(私が疑う番号の後には何もありません)。

Scanner.nextLine()を配置してみてください。あなたが行の残りを無視するつもりなら、それぞれのnextInt()の後に。

120
Peter Lawrey

読み直すたびに余分なscanner.nextLine()を配置するのではなく、改行ごとに各入力を受け入れたいので、実際には改行だけに一致するように区切り文字を変更することをお勧めします。デフォルト)

import Java.util.Scanner;

class ScannerTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.useDelimiter("\\n");

        System.out.print("Enter an index: ");
        int index = scanner.nextInt();

        System.out.print("Enter a sentence: ");
        String sentence = scanner.next();

        System.out.println("\nYour sentence: " + sentence);
        System.out.println("Your index: " + index);
    }
}

したがって、入力行を読むには、nextと同じ振る舞いを持つscanner.next()だけが必要です{Int、Double、...}。

"nextLine()毎回"アプローチとの違いは、後者はインデックスとして<space>33<space>および3<space>whateverも受け入れますが、前者は単独で3を受け入れるだけです。

22
berdario

これは、数字を入力してEnterキーを押すと、input.nextInt()は数字だけを消費し、「行末」は消費しないためです。 int、doubleなどのプリミティブデータ型は「行末」を消費しないため、「行末」はバッファに残り、input.next()が実行されると、最初の入力からバッファから「行末」が消費されます。だからこそ、あなたのString sentence = scanner.next()は「行末」だけを使い、キーボードからの読み込みを待ちません。

ヒント:scanner.nextLine()はキーボードから空白を読み取らないため、scanner.next()の代わりにscanner.next()を使用します。 (キーボードからスペースをいくつか与えた後に文字列を切り捨てます。スペースの前にのみ文字列を表示します。)

10
FAISAL

NextLine()でテキストをスキャンしないでください。同じスキャナでnextInt()を使用した後Java Scannerではうまく機能しません。多くのJava開発者は、整数用に別のScannerを使用することを選択します。必要に応じて、これらのスキャナをscan1とscan2と呼ぶことができます。

9
Umair

または

int selection = Integer.parseInt(scanner.nextLine());
3
Alexandar