使用扫描仪获取用户输入

时间:2012-10-21 16:44:03

标签: java java.util.scanner

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

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类?

p.s:做while(sc.nextLine().equals("Y"))之类的事情会导致循环在首次运行循环后从用户那里获得输入之前终止。

4 个答案:

答案 0 :(得分:9)

这是因为您使用的是Scanner#next方法。如果查看该方法的文档,它将返回下一个标记读取。

因此,当您使用next方法读取用户输入时,它不会在最后读取newline。然后由nextLine()循环内的while读取。因此,firstName在您不知情的情况下包含newline

因此,您应该使用nextLine()而不是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()之后添加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]");

答案 1 :(得分:4)

  • 使用equalsIgnoreCase(..)来防止 Y N 为小写,反之亦然。
  • 请勿使用sc.next()代替sc.nextLine()来实现您的目标,因为next()只会在nextLine()读取到下一个\n时读取下一个空格nextInt() 1}}休息。
  • 请勿使用String将所有数据都读为nextInt()然后进行转换,因为next()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]"); } 类似,因此无法读取到下一个 \ ñ

试试这样:

{{1}}

答案 2 :(得分: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

答案 3 :(得分: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();
    }
}