想象一下以下的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中的几个问题提到了多个扫描仪,但他们的问题只使用了一个扫描仪对象,所以我今天就问这个。)
答案 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();