不同的Java Scanner用于输入不同类型

时间:2014-03-20 19:09:08

标签: java java.util.scanner

想象一下以下的scanario: 我有一个程序要求输入整数,然后是字符串输入。

int age=0;
String name;
Scanner sc = new Scanner(System.in);

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc.nextLine();

使用aobe代码,我没有机会输入名称。所以我通常会按如下方式声明2个扫描仪对象:

int age=0;
String name;
Scanner sc = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);    //2nd Scanner object

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc2.nextLine();                    //Using 2nd Scanner Object

我的问题是:是否有必要声明多个扫描仪对象接受不同类型的输入?我是否以正确的方式做出了自己的想法?

我已经考虑过这个问题多年了。 (SO中的几个问题提到了多个扫描仪,但他们的问题只使用了一个扫描仪对象,所以我今天就问这个。)

5 个答案:

答案 0 :(得分:2)

每个要扫描的对象只应使用一个Scanner个实例。在这种情况下,您正在阅读System.in,因此同时在同一个上打开两个扫描仪甚至没有意义。

所以你绝对想要第一个选择,那么问题就来了,它有什么问题:

嗯,你要求sc.nextInt(),一个整数,一个名字很少是一个整数。您最有可能在一个单词中查找name = sc.next()或在整个句子中查找name = sc.nextLine()(直到按下回车键)。

另请注意,在sc.nextInt()之后,实际上在sc.next***()之后,需要 Enter

答案 1 :(得分:2)

@skiwi只使用一个Scanner是正确的,所以你正确地做到了这一点。它不起作用的原因是nextInt()消耗构成整数的所有字符,但它不接触行尾字符。因此,当调用nextLine()时,它会看到行尾字符之前没有字符,因此它认为输入了一个空行,然后返回一个空字符串。但是,nextLine()会消耗行尾字符,因此如果您在执行sc.nextLine();之前拨打name = sc.nextLine();一次,它就应该有效。

答案 2 :(得分:2)

您没有机会输入名称,因为nextInt()没有读取换行符'\n'(按 Enter 后由用户输入) ,而nextLine()确实如此。因此,只要您致电name = sc.nextLine();,它就会只读取'\n'尚未阅读的nextInt()字符。

如果您正在扫描相同的内容(例如System.in),则绝对不要创建新的扫描仪 - 只有在扫描其他内容时才更改扫描仪,例如不同的文件或其他内容。

要使代码正常工作(只有一个Scanner实例),请使用:

int age = 0;
String name;
Scanner sc = new Scanner(System.in);

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");

sc.nextLine(); // "dispose" of the '\n' character
               // so that it is not recorded by the next line

name = sc.nextLine();

// print your findings
System.out.println("------\nAge: " + age + "\nName: " + name);

输入/输出示例:

Enter Age: 17
Enter Name: Michael
------
Age: 17
Name: Michael

答案 3 :(得分:0)

您也可以使用:

name = sc.next();

答案 4 :(得分:0)

这必须工作完美。我测试了。

int age=0;
String name;
Scanner sc = new Scanner(System.in);

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc.nextLine();