web-dev-qa-db-ja.com

スキャナーでユーザー入力を取得する

スキャナーにループで入力を取得させようとしています。ユーザーが終了したい場合は、このループを終了できます。私はそれを行うためにさまざまな方法を試しましたが、常にいくつかの問題があります。これはコードです:

_private void inputEntries() {
    Scanner sc = new Scanner(System.in);
    System.out.println("Continue?[Y/N]");
    while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
        System.out.println("Enter first name");
        String name = sc.nextLine();
        System.out.println("Enter surname");
        String surname = sc.nextLine();
        System.out.println("Enter number");
        int number = sc.nextInt();
        Student student = new Student(name, surname, number);
        students.add(student);
        try {
            addToFile(student);
        } catch (Exception ex) {
            Logger.getLogger(TextReader.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Continue?[Y/N]");
    }
}
_

上記のコードの問題は、私が試したさまざまなメソッドでも発生しますが、ユーザーが[〜#〜] y [〜#〜]と入力すると、Scannerがスキップされます名の最初の入力、および姓にジャンプします。ユーザーが[〜#〜] n [〜#〜]と入力すると、ループは正しく停止します。これが発生する理由と、Scannerクラスの使用を克服する方法を誰かが説明できますか?

ps:while(sc.nextLine().equals("Y"))のようなことを行うと、ループの最初の実行後、ユーザーから入力を取得する前にループが終了します。

7
Giannis

_Scanner#next_ メソッドを使用しているためです。そして、そのメソッドのドキュメントを見ると、読み込まれた次のトークンが返されます。

したがって、nextメソッドを使用してユーザー入力を読み取る場合、最後にnewlineを読み取ることはありません。次に、whileループ内のnextLine()によって読み取られます。したがって、あなたのfirstNameには、知らないうちにnewlineが含まれています。

したがって、whileではnextLine()ではなくnext()を使用する必要があります。

nextInt メソッドの場合も同様です。また、改行も読みません。したがって、readを使用してreadLineし、_Integer.parseInt_を使用してintに変換できます。入力値をNumberFormatExceptionに変換できない場合は、intをスローできます。したがって、それに応じて処理する必要があります。

以下のコードを試すことができます:-

_Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
    System.out.println("Enter first name");
    String name = sc.nextLine();
    System.out.println("Enter surname");
    String surname = sc.nextLine();
    System.out.println("Enter number");
    int number = 0;
    try {
        number = Integer.parseInt(sc.nextLine());
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }
    System.out.println("Continue?[Y/N]");
}
_

ただし、1つ注意してください。_Integer.parseInt_に渡せない値を入力すると、例外が発生し、その入力はスキップされます。その場合は、whileループを使用して処理する必要があります。

または、その例外処理を行いたくない場合:-

empty sc.nextLine()の後にsc.nextInt()を追加すると、次のように、残りのnewlineを消費します。-

_    // Left over part of your while loop

    String surname = sc.nextLine();
    System.out.println("Enter number");
    int number = sc.nextInt();
    sc.nextLine(); // To consume the left over newline;
    System.out.println("Continue?[Y/N]");
_
9
Rohit Jain
  • [〜#〜] y [〜#〜]または[〜#〜] n [〜#〜]の場合を防ぐためにequalsIgnoreCase(..)を使用します小文字であり、その逆も同様です。
  • sc.next()は次のスペースまでしか読み取らないため、sc.nextLine()は次のスペースまでしか読み取れないため、next()ではなくnextLine()を使用しないでください。次の_\n_休憩まで。
  • nextInt()nextInt()と似ているため、next()はすべてのデータをStringとして読み取ってから変換しないでください。 \ n

このようにしてみてください:

_Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");

while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here

    System.out.println("Enter first name");
    String name = sc.nextLine();

    System.out.println("Enter surname");
    String surname = sc.nextLine();

    System.out.println("Enter number");

    int number=0;

    try {
    number = Integer.parseInt(sc.nextLine());//read int as string using nextLine() and parse
    }catch(NumberFormatException nfe) {
        nfe.printStackTrace();
    }

    System.out.println("Continue?[Y/N]");
}
_
4
David Kroukamp
public void display() {
    int i, j;
    for (i = 1; i <= 5; i++) {
        for (j = i; j < 5; j++) {
            System.out.print(" ");
        }
        for (j = 1; j < (2 * i); j++) {
            System.out.print(i % 2);
        }
        for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
            System.out.print(" ");
        }
        for (j = 1; j < (2 * i); j++) {
            System.out.print(j);
        }
        System.out.println();
    }
    for (i = 4; i >= 1; i--) {
        for (j = i; j < 5; j++) {
            System.out.print(" ");
        }
        for (j = 1; j <= i; j++) {
            System.out.print(j);
        }
        for (j = i - 1; j >= 1; j--) {
            System.out.print(j);
        }
        for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
            System.out.print(" ");
        }
        for (j = 1; j < (2 * i); j++) {
            System.out.print(j);
        }
        System.out.println();
    }
}

あなたは使うことができます

String abc = "abc";
String answer = "null";
while (abc.equals("abc")
{
if (answer.equals("n")
{
break;
}
while (answer.equals("y"))
{
//Put your other code here
System.out.print("Continue? [y/n]")
answer = input.nextLine();
if (answer.equals("n")
{
break;
}
}
}

これにより、入力があったときにプログラムが停止します。

"n"

また、次のようにスキャナーをインポートして作成する必要があります。

//This is how you import the Scanner
import Java.util.Scanner;
//This is how you create the Scanner
Scanner input = new Scanner(System.in);
/**
*The name
*/
"input"
/**
*is used because of
*/
input.nextLine
1
spacegeek224