如何在扫描前检查扫描器是否有输入
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();
}
}
}
我试图在分离令牌之前检查我的扫描仪是否有多个令牌。我目前正在尝试使用 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();
}
}
}