如何在扫描前检查扫描器是否有输入

How To Check If Scanner Has Input Before Scanning Next

我试图在分离令牌之前检查我的扫描仪是否有多个令牌。我目前正在尝试使用 scanner.hasNext()(我的扫描仪名称是 sc)。 如果用户输入 "string int int" 那么我不想打印 "enter age" 或 "enter grade"

System.out.println("Enter name or command: ");
            name = sc.next();
            if(name.toLowerCase().equals("next")) {
                students.remove(0);
            }else if(name.toLowerCase().equals("end")) {
                running = false;
            }else {
//This is where it gets dicey
                if(!sc.hasNext())
                    System.out.println("Enter age: ");
                age = sc.nextInt();
                if(!sc.hasNext())
                    System.out.println("Enter grade: ");
                grade = sc.nextInt();

                if(first) {
                    students.add(new Student(name, age, grade));
                    first = false;
                }else {
                    addStudent(new Student(name, age, grade), students.get(students.size()-1));
                }
            }

目前,无论输入如何,我的程序都会跳过 if 语句。 如果我删除了 !s 那么无论如何都会打印这些行,即使输入是单行也是如此。他们似乎也在 nextInt 被采用后打印,我发现这很奇怪。 如果能提供一些帮助,我将不胜感激!

我不得不进行一些修改,因为它无法编译。当我 运行 它时,它给了我你想要拥有的东西:

C:\Users\..snip..\Whosebug>java src\WhosebugTest.java
Enter name or command:
Peter 78 34
addStudent(new Student(name, age, grade), students.get(students.size()-1));

但是,如果我只输入一个参数,它就会挂起(根据 javaDoc:"This method may block while waiting for input to scan."):

C:\Users\..snip..\Whosebug>java src\WhosebugTest.java
Enter name or command:
hello

这是可编译的修改:

import java.util.Scanner;

public class WhosebugTest {
  static String name;
  static int age;
  static int grade;
  static boolean first;
  static boolean running;

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter name or command: ");
      name = sc.next();
      if(name.toLowerCase().equals("next")) {
            System.out.println("students.remove(0);");
//          students.remove(0);
      }else if(name.toLowerCase().equals("end")) {
          running = false;
      }else {

//This is where it gets dicey
        if(!sc.hasNext())
            System.out.println("Enter age: ");
        age = sc.nextInt();
        if(!sc.hasNext())
            System.out.println("Enter grade: ");
        grade = sc.nextInt();

        if(first) {
            System.out.println("students.add(new Student(name, age, grade));");
//            students.add(new Student(name, age, grade));
            first = false;
        }else {
            System.out.println("addStudent(new Student(name, age, grade), students.get(students.size()-1));");
//            addStudent(new Student(name, age, grade), students.get(students.size()-1));
        }
      }
  }
}

如果你想保持所有选项打开,你可以这样做(注意这里没有异常处理):

import java.util.Scanner;

public class WhosebugTest {
  static String name = "";
  static int age = -1;
  static int grade = -1;

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter name or command: ");


    String[] input = sc.nextLine().split(" ");
    switch (input.length) {
      case 3: grade = Integer.valueOf(input[2]);
              // fallthrough
      case 2: age = Integer.valueOf(input[1]);
              // fallthrough
      case 1: name = input[0];
    };

    if (name.isEmpty()) {
      System.out.println("Enter name: ");
      name = sc.next();
    }   

    if (age == -1) {
      System.out.println("Enter age: ");
      age = sc.nextInt();
    }   

    if (grade == -1) {
      System.out.println("Enter grade: ");
      grade = sc.nextInt();
    }
  }
}