7

我正在尝试让扫描仪循环输入。一旦用户想要完成,他可以退出这个循环。我尝试了许多不同的方法来做到这一点,但总是有一些问题。这是代码:

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")), 的操作将导致循环在第一次运行循环后从用户获取输入之前终止。

4

4 回答 4

9

这是因为您正在使用Scanner#next方法。如果您查看该方法的文档,它会返回下一个读取的令牌。

因此,当您使用next方法读取用户输入时,它不会newline在最后读取。然后由循环nextLine()内部读取。while因此,你firstName包含一个newline你不知道的东西。

所以,你应该nextLine()在你的 while 中使用而不是next().

方法的情况也类似nextInt。它也不会读取换行符。因此,您可以read使用readLine并将其转换为int使用Integer.parseInt. 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]");
}

但是,请注意一件事,如果您输入一个无法传递给您的值,Integer.parseInt您将得到一个异常,并且该输入将被跳过。对于这种情况,您需要使用while循环来处理它。

或者,如果您不想进行异常处理:-

您可以添加一个empty sc.nextLine()after 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]");
于 2012-10-21T16:57:36.273 回答
4
  • 用于equalsIgnoreCase(..)防止YN的大小写为小写,反之亦然。
  • 不要使用sc.next()rathersc.nextLine()来实现你想要的,因为next()只读取到下一个空格,而nextLine()读取到下一个中\n​​断。
  • 不要使用nextInt()read all data asString然后转换,因为nextInt()就像next()这样不会读到下一个\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]");
}
于 2012-10-21T16:53:55.277 回答
1

你可以使用

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
于 2013-10-24T17:33:14.577 回答
1
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();
    }
}
于 2015-09-27T12:38:32.193 回答